Frage

Ich habe ein benutzerdefiniertes Modell und ein Ressourcenmodell. Ich möchte eine einzelne Instanz des Modells mit mehr als 1 Feld laden.

Das Modell hat die folgenden 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 für jedes Feld eine Sammlung und Addfilter. Das funktioniert, aber ich habe mich gefragt, ob es in Magento eine Standardstrategie für diese Art von Dingen gibt.

BEARBEITEN

Core Magento scheint keine Sammlungen für dieses Szenario zu verwenden, sondern verwendet direkte SQL -Abfragen in den Ressourcenmodellen.

Ein Beispiel dafür ist:

loadByAccountAndDate() in Mage_Paypal_Model_Resource_Report_Settlement

Gibt es einen Grund dafür, wenn Sammlungen eine prägnantere Art und Weise zu sein scheinen, in Bezug auf die zu schriftliche Menge an Code

Ich weiß nur nicht, warum Magento es so entscheidet, es so zu machen

War es hilfreich?

Lösung

Ich denke, das ist ein guter Ansatz. Vielleicht müssen Sie in der Modellklasse einen Wrapper erstellen, damit Sie vermeiden, dasselbe immer wieder zu schreiben.
Etwas wie:

public function loadByMultiple($tag, $customName, $group){
    $collection = $this->getCollection()
            ->addFieldToFilter('tag_name', $tag)
            ->addFieldToFilter('custom_name', $customName)
            ->addFieldToFilter('group_name', $group);
    return $collection->getFirstItem();
}

Und Sie können das Element wie diesen an jedem anderen Ort laden:

$model = Mage::getModel('model/class_here')->loadByMultiple($tag, $customName, $group);
if ($model->getId()){
   //the instance exists
}
else{
    //not found
}

Andere Tipps

Modul/Modell/Somemodel.php

public function loadByAttributes($attributes)
{
    $this->setData($this->getResource()->loadByAttributes($attributes));
    return $this;
}

Modul/Modell/Ressource/Somemodel.php:

public function loadByAttributes($attributes)
    {
        $adapter = $this->_getReadAdapter();
        $where   = array();
        foreach ($attributes as $attributeCode=> $value) {
            $where[] = sprintf('%s=:%s', $attributeCode, $attributeCode);
        }
        $select = $adapter->select()
            ->from($this->getMainTable())
            ->where(implode(' AND ', $where));

        $binds = $attributes;

        return $adapter->fetchRow($select, $binds);
    }

Und schließlich können Sie das folgende Modell laden:

$attributes = array('tag_name'=> 'any', 'custome_name'=> 'some','group_name'=>'some');
$model      = Mage::getModel('module/somemodel')->loadByAttributes($attributes);

Aktualisiert

Übrigens können Sie diese Methode (LoadByAttributes) einfach verwenden, anstatt die Sammlung zu erfassen, und es ist verständlicher. Magento entsendet auch einige Ereignisse, während das Laden von Sammeln oder Entität und Erweiterung von Drittanbietern die Sammlung oder Entität durch Beobachter aktualisieren. Wenn Sie die Entität über eine Ressource laden (angegeben in mir und Ihrem und in Ihrem), kein Ereignis/Beobachter Feuer und Sie können "saubere" Entität schneller als eine Sammlung erhalten. Auch Magento verwendet auf diese Weise keine zwischengespeicherte Sammlung, sondern lädt sie direkt aus der DB -Tabelle.
Vielleicht ist dies Grund, diese Methode mit Magento -Kernmodulen zu verwenden.

Sie machen es richtig mit addFilter. In Magento können Sie nach jedem Attribut geladen, aber nicht mehrere Attribute gleichzeitig. Durch Hinzufügen von Filtern erzielen Sie den gleichen Effekt ohne zusätzlichen Overhead.

Erstens - Ihre Strategie, eine Sammlung zu filtern, ist korrekt. Da Sammlungen in Magento Lazy-Load die Möglichkeit haben, Methoden in Ihrem Ressourcenmodell zu erstellen, um die Anforderungen Ihrer benutzerdefinierten Last enger zu definieren.

Betrachten Sie ohne einen Teil Ihres Codes die folgende Pseudo-Methoden in Ihrem Ressourcenmodell:

<?php


class Marty_Wallace_Model_Resource_Method extends Mage_Core_Model_Resource_Db_Abstract{

    protected function _construct()
    {
        $this->_init('yourmodel/table', 'entity_id');
    }

    public function loadByCriteria(array $filter)
    {

        //$filter should be array('columnname'=>'value','columname'=>'value')

        $collection = Mage::getModel('yourmodel/class')->getCollection();

        foreach($filter as $column=>$value){
            $collection->addFieldToFilter($column,$value);
        }

        return $collection;

    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top