Question

J'ai un modèle personnalisé et le modèle de ressources. Je veux charger une seule instance du modèle en utilisant plus de 1 champ.

Le modèle a les champs suivants:

id
tag_name
custom_name
group_name

Je veux charger ce modèle basé sur le tag_name, custom_name et nom_groupe au lieu de id.

Actuellement, je suis en utilisant une collection et addFilter pour chaque champ. Cela fonctionne, mais je me suis demandé s'il y a une stratégie standard pour ce genre de chose dans Magento?

EDIT

de base magento ne semble pas aux collections d'utilisation pour ce scénario mais il utilise des requêtes SQL directes dans les modèles de ressources.

un exemple de ceci est:

loadByAccountAndDate() dans Mage_Paypal_Model_Resource_Report_Settlement

Y at-il une raison à cela, quand les collections semblent être une façon plus concise, en termes de quantité de code à écrire

Je viens ne sais pas pourquoi magento choisit de le faire de cette façon

Était-ce utile?

La solution

Je pense que cela est une bonne approche. Peut-être que vous avez besoin pour créer une enveloppe dans la classe de modèle afin que vous éviterez d'écrire la même chose encore et encore.
Quelque chose comme:

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

Et vous pouvez charger l'élément comme celui-ci en tout autre lieu:

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

Autres conseils

Module / Modèle / SomeModel.php

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

Module / Modèle / ressources / 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);
    }

Et enfin, vous pouvez charger le modèle suivant:

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

Mise à jour

Par la façon dont vous pouvez utiliser ce (loadByAttributes) méthode facilement plutôt que de la collecte et il est plus compréhensible. Magento envoie également des événements tandis que la collecte de chargement ou de l'entité et l'extension des tiers peuvent mettre à jour la collecte ou de l'entité par l'observateur. Si vous chargez l'entité via ressource (donnée dans l'exemple de la mienne et la vôtre) aucun cas / observateurs feu et vous pouvez obtenir une entité « propre » plus rapide plutôt que la collecte. utilise pas non plus Magento collection en cache de cette façon, il charge directement à partir de la table db.
Peut-être que la raison de l'utilisation de cette méthode par des modules de base Magento.

Vous faites ce droit avec addFilter. Magento vous pouvez charger par un attribut, mais pas plusieurs attributs à la fois. En ajoutant des filtres vous obtenez le même effet sans frais généraux supplémentaires.

Tout d'abord - votre stratégie pour filtrer une collection est correcte. Parce que les collections dans Magento-charge paresseux vous avez la possibilité de créer des méthodes dans votre modèle de ressources pour définir plus étroitement les exigences de votre charge personnalisée.

Sans une partie de votre code pour exemple, considérer la pseudo-méthode suivante dans votre modèle de ressources:

<?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;

    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top