Frage Erhalte spezifische Spalten mit der Funktion "with ()" in Laravel Eloquent


Ich habe zwei Tische User und Post Ein User viele ... haben posts und ein post gehört nur einem user.

In meinem User Modell habe ich hasMany Beziehung wie

public function post(){
        return $this->hasmany('post');
}

Und in meinem post Modell habe ich belongsTo Beziehung wie

public function user(){
        return $this->belongsTo('user');
}

Jetzt möchte ich von diesen beiden Tabellen mitmachen Eloquent with() aber wollen bestimmte Spalten aus der zweiten Tabelle. Ich weiß, dass ich es gebrauchen kann query Builder aber ich möchte das nicht benutzen. Wenn In post Modell schreibe ich

public function getAllPosts() {
        return Post::with('user')->get();
}

Es werden folgende Abfragen ausgeführt

select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)

Aber ich möchte

select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)

Wenn ich benutze

Post::with('user')->get(array('columns'....));

Es gibt nur die Spalte aus der ersten Tabelle zurück. Ich möchte bestimmte Spalten verwenden with() aus der zweiten Tabelle. Wie kann ich das machen?


97
2017-11-08 06:30


Ursprung


Antworten:


Nun, ich habe die Lösung gefunden. Es kann eine gemacht werden, indem man a closure Funktion in with() als zweiter Index von Array wie

 Post::with(array('user'=>function($query){
        $query->select('id','username');
    }))->get();

Es wird nur ausgewählt id und username von anderer Tabelle. Ich hoffe, dass dies anderen hilft.


Denken Sie daran, dass der Primärschlüssel (id in diesem Fall) in $ query-> select () erforderlich ist, um die notwendigen Ergebnisse tatsächlich abzurufen.


203
2017-11-12 05:17



In deinem Post Modell-

public function user()
{
    return $this->belongsTo('User')->select(array('id', 'username'));
}

Der ursprüngliche Kredit geht an Laravel Eager Loading - Laden Sie nur bestimmte Spalten


56
2017-11-08 13:43



Wenn du in die andere Richtung gehst (hasMany):

User::with(array('post'=>function($query){
        $query->select('id','user_id');
    }))->get();

Vergessen Sie nicht, den Fremdschlüssel anzugeben (vorausgesetzt, es handelt sich in diesem Beispiel um eine Benutzer-ID), um die Beziehung zu lösen. Andernfalls erhalten Sie keine Ergebnisse für Ihre Beziehung.


37
2017-08-24 15:05



Das kannst du in Laravel 5.5 so machen:

Post::with('user:id,username')->get();

Sorge für die id Feld wie in der Dokumente:

Wenn Sie diese Funktion verwenden, sollten Sie immer die ID-Spalte einschließen   die Liste der Spalten, die Sie abrufen möchten.


22
2017-11-11 13:12



In deinem Post Modell:

public function userWithName()
{
    return $this->belongsTo('User')->select(array('id', 'first_name', 'last_name'));
}

Jetzt können Sie verwenden $post->userWithName


8
2018-06-22 02:11



In Laravel 5.6 können Sie ein bestimmtes Feld aufrufen

$users = App\Book::with('author:id,name')->get();

6
2018-02-24 09:33



Beachten Sie, dass, wenn Sie nur eine Spalte aus der Tabelle benötigen, die Verwendung von 'Listen' ziemlich nett ist. In meinem Fall erhalte ich die Lieblingsartikel eines Benutzers, aber ich möchte nur die Artikel-IDs:

$favourites = $user->favourites->lists('id');

Gibt ein Array von IDs zurück, zB:

Array
(
    [0] => 3
    [1] => 7
    [2] => 8
)

3
2017-11-21 09:58



Jetzt können Sie das verwenden pluckMethode auf a Collection Beispiel:

Dies wird nur die zurückgegeben uuid Attribut des Post model

App\Models\User::find(2)->posts->pluck('uuid')
=> Illuminate\Support\Collection {#983
     all: [
       "1",
       "2",
       "3",
     ],
   }

0
2018-05-20 00:12