2017-09-02 3 views
1

J'ai modèles A, B et C. Une relation hasOne avec B et la relation B hasMany avec C.Comment puis-je récupérer des données d'un modèle relationnel distant dans Laravel Eloquent en utilisant le chaînage de méthodes?

//Model Code 

class A extends Model 
{ 
    //This relates A and B 
    public function relateBC(){ 
     return $this->hasOne('App\B','aid','aid'); 
    } 
} 

class B extends Model 
{ 
    //Inverse relationship with Model A 
    public function relateBC(){ 
     return $this->belongsTo('App\A','aid','aid'); 
    } 

    //This relates B and C 
    public function relateBC(){ 
     return $this->hasMany('App\C','bid','bid'); 
    } 
} 


class C extends Model 
{ 
    //Inverse relationship with Model B 
    public function post(){ 
     return $this->belongsTo('App\B','bid','bid'); 
    } 
} 

Ci-dessous les données de retour de code du modèle B

App\A::find(id)->relateAB()->get(); 

Ci-dessous les données de retour du code de modèle C

App\B:find(id)->relateBC()->get();   

Le code ci-dessous renvoie BadMethodException. La méthode relationBC() n'existe pas.

App\A::find(id)->relateAB->relateBC()->get();  

.

+0

Bienvenue sur StackOverflow. S'il vous plaît, pourriez-vous fournir un code de votre problème spécifique. Cela prouve à quel point vous avez essayé et cela aidera les autres membres à mieux comprendre votre problème, à ce moment-là, vous leur donnerez un contexte de votre problème. S'il vous plaît, vérifiez ces liens: https://stackoverflow.com/help/mcve et https://stackoverflow.com/help/how-to-ask –

Répondre

0

Essayez ceci:

$distantRelations = App\A::find($id)->relateAB->relateBC; 

Lorsque l'on accède comme méthode (c.-à-->relateAB()), vous revenez le HasOne relationship object (l'objet que vous pouvez appeler ->get() sur), alors que quand on y accède comme une propriété magique (à savoir: -> relier), vous récupérez l'instance du modèle (l'objet auquel vous pouvez accéder, relation relateBC).

Vous pourrait utiliser la méthode au lieu de la propriété magique, mais gardez à l'esprit que vous êtes alors celui qui doit déterminer le type de relation (un par rapport à beaucoup), et appelez soit ->get() ou ->first() du sous-jacent générateur de requêtes respectivement:

$distantRelations = App\A::find($id) 

    // 'relateAB' is a singular relation, 
    // so we'll need to call 'first()' 

    ->relateAB()->first() // > App\B 

    // 'relateBC' is a 'many' relation, 
    // so we'll need to call 'get()' 

    ->relateBC()->get(); // > App\C[]|\Illuminate\Support\Collection 

HasOne appelant first()

Vous pouvez assister à HasOne appeler first() pour vous sur le générateur de requête at this line, exécuté en accédant à la relation en tant que propriété magique.

HasMany appelant get()

Vous pouvez assister à HasMany appeler get() pour vous sur le générateur de requêtes at this line, exécutée en accédant à la relation en tant que propriété magique.

+0

Essayé cela, j'ai reçu une BadMethodCallException avec le message 'Appel à la méthode non définie Illuminate \ Base de données \ Query \ Builder :: relateAB() ' – Fynix

+0

Veuillez mettre à jour votre question avec le code approprié (supprimer les éléments inutiles). Inclure les 3 modèles et les méthodes de relation pertinentes. De plus, certaines informations sur vos tables de base de données (leurs noms, les noms des colonnes de la clé primaire) seraient utiles. –

+0

J'ai inclus les codes du modèle. – Fynix

0

déclaré clé primaire d'un modèle de modèle et B dans le tableau croisé dynamique comme c'est-clé étrangère des deux tables