2016-07-25 2 views
0

J'ai 3 modèles: Articles, Séries et SériesCatégories. Quand je montre le formulaire d'article (pour créer ou mettre à jour) j'ai besoin de montrer les séries qui appartiennent à un categoryId choisi dans une étape précédente. Une publication en série peut appartenir à plusieurs catégories.Yii2. Modèles liés

En ce moment j'ai sur mon modèle de l'article:

public function getSerialsTypeByCategory() { 
     return (new SerialType)->getByCategory($this->itemCategoryId); 
    } 

Sur mon modèle SerialType:

public function getByCategory($itemCategoryId) { 

     return SerialTypeItemCategory::find()->select(['serialTypeId'])->where(['itemCategoryId' => $itemCategoryId])->all(); 

    } 

Cela fonctionne, il fait ce que j'ai besoin, mais ... Est-ce la bonne façon ? Y a-t-il un meilleur moyen?

+0

me semble juste .. le code est au bon endroit (modèle) et écrit dans le droit chemin (getter) – scaisEdge

Répondre

2

ce n'est pas faux ce que vous faites. mais il y a quelque chose de plus - vérifier ce lien: Working with Relational Data

si vous utilisez ->hasOne et ->hasMany pour définir les relations, vos gains modèles certains avantages supplémentaires, comme se joindre à chargement paresseux ou désireux:

Item::findOne($id)->with(['categories'])->all(); 

avec Une relation, vous pouvez également utiliser ->link et ->unlink, pour ajouter/supprimer des données connexes sans avoir à penser à des champs liés.

De plus, il est facile de définir les relations via table de jonction:

class Order extends ActiveRecord 
{ 
    public function getItems() 
    { 
     return $this->hasMany(Item::className(), ['id' => 'item_id']) 
      ->viaTable('order_item', ['order_id' => 'id']); 
    } 
} 
+0

Merci une lot !, je vais chercher sur viaTable, la première fois que je le vois. – Eduardo