2017-10-19 5 views
0

In Laravel 5.5 J'ai une configuration de base de données comme l'image ERD ci-dessous. Je préfère utiliser Eloquent plutôt que Query Builder, mais je ne suis pas sûr que cela puisse être fait par Eloquent.Laravel Eloquent/DB obtenant une relation par table étrangère et résultats de commande

enter image description here

Relations

  • Objet A -> Objet B [un - un à plusieurs]
  • objet B -> Objet C [un - one]

Comment ld Je fais ce qui suit: Commencez la requête avec l'objet A. Par l'intermédiaire de l'objet AI voulez obtenir le (s) objet (s) B et si l'objet BI veut obtenir l'objet C. La dernière chose requise est que les résultats seront triés croissant par la colonne position dans l'objet B.

ce que je me suis essayé: Avec Eloquent obtenir l'objet A et tous les objets de B (ceci est trié croissant sur la position). Pour chaque objet de B chercher l'objet correspondant C. Mais je sais que ce n'est pas la meilleure solution pour le problème.

Un conseil?

+1

il est certainement possible, lire sur https://laravel.com/docs/5.5/eloquent-relationships – pseudoanime

+0

@pseudoanime Merci pour la référence. J'ai lu cette page plusieurs fois mais quelle partie de la documentation préféreriez-vous utiliser pour ce scénario? –

+0

Jetez un oeil à chargement impatient imbriqué dans la page. $ results = ObjectA :: with ('ObjectB.ObjectC) -> get(); vous donnera tous les 3 objets. Ensuite, c'est juste une question de tri. – pseudoanime

Répondre

0

Avec l'aide de vous les gars, je suis venu à la meilleure solution que je pouvais penser de:

ObjectA::with(['ObjectB' => function($query){ 
    $query->orderBy('position', 'asc'); 
},'ObjectB.ObjectC'])->get(); 

ObjectA Modèle

public function ObjectB() 
{ 
    return $this->hasMany('App\ObjectB'); 
} 

ObjectB Modèle

public function ObjectC() 
{ 
    return $this->hasOne('App\ObjectC'); 
} 
1

Vous devriez être capable de le faire avec impatience de chargement.

Quelque chose comme:

$result = $ObjectA->with(['ObjectB', 'ObjectB.ObjectC'])->get(); 

https://laravel.com/docs/5.5/eloquent-relationships#eager-loading

+0

Cela ne fonctionne que si ObjectA a une relation directe avec ObjectC right? Mais ObjectA a une relation via ObjectB avec ObjectC. –

0

Vous pouvez utiliser Eloquent

$data['result'] = ObjectA::join('ObjectB','ObjectA.id','=','ObjectB.object_a_id') 
->join('ObjectC','ObjectB.id','=','ObjectC.object_b_id')->get(); 
+0

Merci cela fonctionne mais deux choses que je remarque: 1. Vous avez oublié '-> orderBy ('position', 'asc')' et 2. Je n'ai plus les informations de ObjectA. Aimeriez-vous au moins avoir l'identifiant de objectA avec toutes les informations des autres objets. J'ai besoin de tous les champs de toutes les tables afin qu'une jointure ne soit pas si mauvaise. –

1

Je mis à jour le commentaire précédent par Gerson où ma modifier doit être visible jusqu'à revue, mais voici comment Je le ferais:

$result = $ObjectA->with(['ObjectB', 'ObjectB.ObjectC'])->get(); 
0

C'est ce que je probablement essayer de le faire:

$ObjectA->with('ObjectB.ObjectC') 
    ->join('ObjectB','ObjectA.id','=','ObjectB.object_a_id') 
    ->orderBy('ObjectB.position','asc') 
    ->get();