2017-09-24 3 views
0

Heute wollte ich etwas sauberen Code tun, also gerade angefangen, Spalten für mit Beziehung auszuwählen. Mit diesem Code:Laravel-Beziehung mit Methode "mit" gibt null zurück

\App\Genre::with([ 
    'family' 
     ])->where([ 
     'slug' => $slug, 
     'is_active' => true 
     ])->first(); 

alles funktioniert gut. Aber wenn ich starte Spalt für „mit“ Methode auswählen:

\App\Genre::with([ 
    'family' => function ($query) { 
     $query->select('name_pl', 'name_lat'); 
    }])->where([ 
     'slug' => $slug, 
     'is_active' => true 
    ])->first(); 

Ich habe die Familie null ist (aber es sollte ein Objekt mit Spalten sein: name_pl, name_lat). Was mache ich falsch?

Familie Methode in Genre-Klasse sieht wie folgt aus:

public function family() { 
    return $this->belongsTo(Family::class); 
} 

Ich bin mit Laravel 5.4

Antwort

1

Warum versuchen Sie nicht:

\App\Genre::with('family:name_pl,name_lat')->where([ 
    'slug' => $slug, 
    'is_active' => true 
])->first(); 
+1

Wow, das wusste ich nicht. Es funktioniert ziemlich gut, danke! –

1

Ziemlich sicher, dass Sie benötigen ein hinzufügen Spalte mit der Liste der ausgewählten Spalten, andernfalls kann Laravel die Daten nicht mit eager-load vergleichen.

Unter der Annahme, dass Genre eine family_id hat und Family hat eine id Primärschlüsselspalte angegeben, müssen Sie dies:

$query->select('id', 'name_pl', 'name_lat'); // See the id added here? 

den Trick tun sollten.

Aus Gründen der Klarheit die passende I erwähnt ist dieser:

select * from genre 

select * from family where id in (1, 2, 3, 4, 5, ...) 

- wo die durch Kommata getrennte Liste von IDs besteht aus den einzigartigen family_id in der ersten Abfrage abgerufenen Werte.

+0

Ja, Sie haben Recht, aber ich bevorzuge immer noch die Lösungen von Hazem Emad. Es sieht ein bisschen schlauer aus. –

Verwandte Themen