Ich habe zwei Tische User
und Post
. Man User
kann viele haben posts
und man post
gehört nur einem user
.
In meinem User
Modell habe ich eine hasMany
Beziehung ...
public function post(){
return $this->hasmany('post');
}
Und in meinem post
Modell habe ich eine belongsTo
Beziehung ...
public function user(){
return $this->belongsTo('user');
}
Jetzt möchte ich diese beiden Tabellen mit verbinden Eloquent with()
, möchte aber bestimmte Spalten aus der zweiten Tabelle. Ich weiß, dass ich den Query Builder verwenden kann, möchte es aber nicht.
Wenn Post
ich im Modell schreibe ...
public function getAllPosts() {
return Post::with('user')->get();
}
Es werden die folgenden Abfragen ausgeführt ...
select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)
Aber was ich will ist ...
select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)
Wenn ich benutze ...
Post::with('user')->get(array('columns'....));
Es wird nur die Spalte aus der ersten Tabelle zurückgegeben. Ich möchte bestimmte Spalten with()
aus der zweiten Tabelle verwenden. Wie kann ich das machen?
$query->select('id','username');
, bekam ichTrying to get property of non-object
id
in diesem Fall) erforderlich ist$query->select()
, um die erforderlichen Ergebnisse tatsächlich abzurufen. Ich habe dies in meinem Code weggelassen und konnte nicht herausfinden, warum keine Ergebnisse erzielt wurden. Wie dumm von mir! Hoffe, dies hilft allen anderen mit dem gleichen ProblemSie können es seit Laravel 5.5 so machen:
Pflege für das
id
Feld undforeign keys
wie in den Dokumenten angegeben :Wenn der Benutzer beispielsweise zu einem Team gehört und eine
team_id
Spalte als Fremdschlüssel hat,$post->user->team
ist diese leer, wenn Sie keine Angaben machenteam_id
quelle
get()
Methode einschränken möchtenPost::with('user:id,username')->get(['age', 'color']);
In Ihrem
Post
ModellDas ursprüngliche Guthaben geht an Laravel Eager Loading - Nur bestimmte Spalten laden
quelle
$fields
Parameter hinzufügen .Wenn Sie in die andere Richtung gehen (hasMany):
Vergessen Sie nicht, den Fremdschlüssel (in diesem Beispiel vorausgesetzt, er ist user_id) anzugeben, um die Beziehung aufzulösen. Andernfalls erhalten Sie keine Ergebnisse für Ihre Beziehung.
quelle
In Laravel 5.7 können Sie ein bestimmtes Feld wie dieses aufrufen
Es ist wichtig,
foreign_key
der Auswahl ein Feld hinzuzufügen .quelle
In Ihrem
Post
Modell:Jetzt können Sie verwenden
$post->userWithName
quelle
Wenn Sie bestimmte Spalten
with()
in laravel eloquent verwenden möchten, können Sie den folgenden Code verwenden, der ursprünglich von @Adam in seiner Antwort hier als Antwort auf dieselbe Frage beantwortet wurde:Also habe ich es in meinem Code verwendet, aber es gab mir einen Fehler von
1052: Column 'id' in field list is ambiguous
, also wenn ihr auch vor dem gleichen Problem stehtUm es zu lösen, müssen Sie den Tabellennamen vor der ID-Spalte in der
with()
Methode wie folgt angeben :quelle
Ich bin auf dieses Problem gestoßen, aber mit einer zweiten Schicht verwandter Objekte. Die Antwort von @Awais Qarni gilt für die Aufnahme des entsprechenden Fremdschlüssels in die verschachtelte select-Anweisung. So wie in der ersten verschachtelten select-Anweisung eine ID erforderlich ist, um auf das verwandte Modell zu verweisen, muss der Fremdschlüssel auf den zweiten Grad verwandter Modelle verweisen. in diesem Beispiel das Unternehmensmodell.
Wenn Sie bestimmte Spalten aus dem Post-Modell auswählen möchten, müssen Sie außerdem die Spalte user_id in die select-Anweisung aufnehmen, um darauf zu verweisen.
quelle
Beachten Sie, dass die Verwendung von 'Listen' sehr hilfreich ist, wenn Sie nur eine Spalte aus der Tabelle benötigen. In meinem Fall rufe ich die Lieblingsartikel eines Benutzers ab, möchte aber nur die Artikel-IDs:
Gibt ein Array von IDs zurück, z.
quelle
toArray()
!!!$user->favourites->lists('id')->toArray();
$user->favourites
wirdCollection
mit allen ausgewählten Feldern zurückgegeben. Die richtige Verwendung ist :$user->favourites()->lists('id')
.Query\Builder::lists
Methode undCollection::lists
Methode zu kennen.Sie können zum Zeitpunkt des Zugriffs auch Spalten für das zugehörige Modell angeben.
Post::first()->user()->get(['columns....']);
quelle
Jetzt können Sie die
pluck
Methode für eineCollection
Instanz verwenden:Dies gibt nur das
uuid
Attribut von zurückPost model
quelle
Versuchen Sie es mit Bedingungen.
quelle
quelle