Comment charger des données de modèle joignant 2 tables?


9

Supposons que j'ai un simple modèle A qui cible la table A maintenant, je dois ajouter des informations supplémentaires, donc je décide de créer un modèle B et d'enregistrer ces informations supplémentaires dans un tableau B avec une clé étrangère pointant vers la clé d'index du tableau A.

Habituellement, les jointures sont effectuées dans des collections, mais si je charge un modèle, la collection n'est pas appelée, mais seule la resource modelest utilisée.

Comment puis - je modifier le modèle A pour charger également des données de tableau B sur load()?


Bonne question ... j'aime ça
Amit Bera

C'est une sorte d'implémentation simple de l'EAV ... J'ai trouvé une sorte de solution mais j'attends une autre approche et la teste, avant de la poster
Fra

Réponses:


11

La classe de modèle de ressource interne ajoute la fonction suivante

protected function _getLoadSelect($field, $value, $object)
{
    $select = parent::_getLoadSelect($field, $value, $object);

    $select->joinLeft(
        array('t_b' => 'table_b'),
        $this->getMainTable() . '.id = t_b.id',
        array('columnA'));
    return $select;
}

Lorsque vous avez appelé Mage::getModel('modulename/TableA')->load(1), cette méthode se joint à table_b.


Je pense que ce limit(1)n'est pas obligatoire: joinLeft()sera suffisant ...
Fra

Je viens de donner un exemple à cela. Vous pouvez changer cela en fonction de vos besoins.
Sohel Rana

6

Je peux vous proposer l'approche que j'utilise, et c'est assez simple.

Pas:

  1. Réécrire le modèle de ressource du modèle A (si le modèle A est le vôtre et non Magento, vous pouvez ignorer cette étape)

  2. Réécrire la méthode _getLoadSelect () du modèle de ressource du modèle A. La requête de sélection est générée dans cette méthode et ici vous pouvez joindre vos autres tables.


Tu m'as battu. +1
Marius
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.