Ich habe ein benutzerdefiniertes Modell und ein Ressourcenmodell. Ich möchte eine einzelne Instanz des Modells mit mehr als einem Feld laden.
Das Modell hat folgende Felder:
id
tag_name
custom_name
group_name
Ich möchte dieses Modell basierend auf tag_name, custom_name und group_name anstelle von id laden.
Derzeit verwende ich eine Sammlung und AddFilter für jedes Feld. Das funktioniert, aber ich habe mich gefragt, ob es in Magento eine Standardstrategie für diese Art von Dingen gibt.
BEARBEITEN
Core Magento scheint für dieses Szenario keine Sammlungen zu verwenden, sondern verwendet direkte SQL-Abfragen in den Ressourcenmodellen.
Ein Beispiel hierfür ist:
loadByAccountAndDate()
im Mage_Paypal_Model_Resource_Report_Settlement
Gibt es einen Grund dafür, wenn Sammlungen in Bezug auf die Menge des zu schreibenden Codes übersichtlicher erscheinen?
Ich weiß nur nicht, warum Magento es so macht
quelle
_itemObjectClass
, die der des tatsächlich aufrufenden Modells entsprichtloadByMultiple
. Wäre dies nicht$x = Mage::getModel('some/model')
eine Instanz eines Modells und$x->loadByMultiple($tag, $customName, $group)
tatsächlich eine andere / neue Instanz?loadByAttribute
. Siehe diese Frage als Referenz: magento.stackexchange.com/q/5926/146Modul / Modell / SomeModel.php
Modul / Modell / Ressource / SomeModel.php:
Und schließlich können Sie folgendes Modell laden:
Aktualisiert
Übrigens können Sie diese (loadByAttributes) -Methode einfach anstelle einer Sammlung verwenden, und sie ist verständlicher. Magento löst auch einige Ereignisse aus, während die Sammlung oder Entität geladen wird, und die Erweiterung eines Drittanbieters kann die Sammlung oder Entität nach Beobachter aktualisieren. Wenn Sie die Entität über eine Ressource laden (in meinem und Ihrem Beispiel angegeben), wird kein Ereignis / Beobachter ausgelöst, und Sie können schneller eine "saubere" Entität erhalten als eine Sammlung. Außerdem verwendet Magento die zwischengespeicherte Sammlung nicht auf diese Weise, sondern lädt sie direkt aus der DB-Tabelle.
Vielleicht ist das der Grund, warum diese Methode von Magento-Kernmodulen verwendet wird.
quelle
$this->setData($this->getResource()->loadByAttributes($attributes));
das sollte sein:$this->setData($this->getResource()->loadByAttributes($attributes)->getData());
Richtig?Du machst es richtig mit
addFilter
. In Magento können Sie nach jedem Attribut aber nicht nach mehreren Attributen gleichzeitig laden. Durch Hinzufügen von Filtern erzielen Sie den gleichen Effekt ohne zusätzlichen Aufwand.quelle
addFilter
macht das? :-)Erstens: Ihre Strategie zum Filtern einer Sammlung ist richtig. Da Sammlungen in Magento verzögert geladen werden, können Sie Methoden in Ihrem Ressourcenmodell erstellen, um die Anforderungen Ihrer benutzerdefinierten Ladung genauer zu definieren.
Berücksichtigen Sie in Ihrem Ressourcenmodell die folgende Pseudomethode, ohne dass Sie einen Teil Ihres Codes testen müssen:
quelle