J'ai un modèle personnalisé et un modèle de ressource. Je veux charger une seule instance du modèle en utilisant plus d'un champ.
Le modèle comporte les champs suivants:
id
tag_name
custom_name
group_name
Je veux charger ce modèle en fonction de tag_name, custom_name et group_name au lieu de id.
Actuellement, j'utilise une collection et addFilter pour chaque champ. Cela fonctionne, mais je me demandais s'il existe une stratégie standard pour ce type de chose dans Magento?
ÉDITER
Core magento ne semble pas utiliser de collections pour ce scénario, mais utilise plutôt 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 a-t-il une raison à cela, lorsque les collections semblent être un moyen plus concis, en termes de quantité de code à écrire
Je ne sais juste pas pourquoi magento choisit de le faire de cette façon
la source
_itemObjectClass
qui est le même que le modèle appelant réellementloadByMultiple
. Par conséquent, ne serait-ce pas$x = Mage::getModel('some/model')
une instance d'un modèle et en$x->loadByMultiple($tag, $customName, $group)
fait une instance différente / nouvelle?loadByAttribute
. Voir cette question pour référence: magento.stackexchange.com/q/5926/146Module / Model / SomeModel.php
Module / Modèle / Ressource / SomeModel.php:
Et enfin, vous pouvez charger le modèle suivant:
Mis à jour
Soit dit en passant, vous pouvez utiliser cette méthode (loadByAttributes) facilement plutôt que la collection et c'est plus compréhensible. Magento envoie également certains événements lors du chargement d'une collection ou d'une entité et une extension tierce peut mettre à jour la collection ou l'entité par observateur. Si vous chargez l'entité via une ressource (donnée dans l'exemple du mien et le vôtre), aucun événement / observateur ne se déclenche et vous pouvez obtenir une entité "propre" plus rapidement que la collecte. De plus, Magento n'utilise pas la collection en cache de cette façon, il la charge directement à partir de la table db.
C'est peut-être la raison de l'utilisation de cette méthode par les modules de base de Magento.
la source
$this->setData($this->getResource()->loadByAttributes($attributes));
qui devrait être: non$this->setData($this->getResource()->loadByAttributes($attributes)->getData());
?Vous le faites bien avec
addFilter
. Dans Magento, vous pouvez charger par n'importe quel attribut mais pas par plusieurs attributs à la fois. En ajoutant des filtres, vous obtenez le même effet sans surcharge supplémentaire.la source
addFilter
faire? :-)Premièrement, votre stratégie pour filtrer une collection est correcte. Étant donné que les collections dans Magento lazy-load, vous avez la possibilité de créer des méthodes dans votre modèle de ressource pour définir plus précisément les exigences de votre chargement personnalisé.
Sans une partie de votre code à échantillonner, envisagez la pseudo-méthode suivante dans votre modèle de ressource:
la source