A cosa serve il secondo parametro in Mage::getModel
-
13-12-2019 - |
Domanda
Scusate la domanda, ma ho cercato su google ma non ho trovato la risposta.
In app/core/Mage/Sales/Model/Convert/Order.php
alla linea 513 c'è questa regola:
$this->_order = Mage::getModel('sales/order')->load($this->getOnepage()->getQuote()->getId(), 'quote_id');
Ma dov'è il secondo parametro nella funzione di caricamento?Come so, un parametro ottiene l'ID del campo primario, giusto?È questo il secondo parametro quote_id
non la chiave primaria, ma caricherà il record $this->getOnepage()->getQuote()->getId()
?
Grazie in anticipo.
Soluzione
La risposta breve è che il secondo parametro prevede un nome di campo in base al quale desideri caricare il prodotto.Ciò ti consente di caricarlo con qualcosa di diverso dal semplice id, ma viene impostato automaticamente sull'id se non viene fornito nulla.Maggiori informazioni sono riportate di seguito se desideri dettagli:
Se guardi nel modulo "vendite/ordini" in app/code/core/Mage/Sales/Model/Order.php
scoprirai che non ha una funzione di caricamento dichiarata, quindi risaliamo la catena della sua eredità Mage_Sales_Model_Abstract
e inoltre non ha una funzione di caricamento.Fino a un ulteriore livello di eredità Mage_Core_Model_Abstract
ci mostra questa funzione:
public function load($id, $field=null)
{
$this->_beforeLoad($id, $field);
$this->_getResource()->load($this, $id, $field);
$this->_afterLoad();
$this->setOrigData();
$this->_hasDataChanges = false;
return $this;
}
Se guardi la riga che contiene _getResource, vedrai che questo secondo parametro viene passato alla risorsa per aiutarla a caricarla.
Se carichi la risorsa per "sales/order" in app/code/core/Mage/Sales/Resource/Order.php non troverai una funzione di caricamento, quindi devi fare un paio di passaggi nell'ereditarietà per Mage_Core_Model_Resource_Db_Abstract
per trovare la funzione di carico:
public function load(Mage_Core_Model_Abstract $object, $value, $field = null)
{
if (is_null($field)) {
$field = $this->getIdFieldName();
}
$read = $this->_getReadAdapter();
if ($read && !is_null($value)) {
$select = $this->_getLoadSelect($field, $value, $object);
$data = $read->fetchRow($select);
if ($data) {
$object->setData($data);
}
}
$this->unserializeFields($object);
$this->_afterLoad($object);
return $this;
}
Puoi vedere in questa funzione che se il campo non è impostato, per impostazione predefinita viene utilizzato il campo id utilizzando $this->getIdFieldName().
$this->getLoadSelect utilizza il campo per caricare l'oggetto desiderato in base a quel campo.