wake-up-neo.com

Holen Sie sich bestimmte Spalten mit der Funktion "Mit ()" in Laravel Eloquent

Ich habe zwei Tabellen, User und Post. Eine User kann viele posts haben und eine post gehört nur zu einer user

In meinem Modell User habe ich eine Beziehung hasMany ...

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

Und in meinem Modell post habe ich eine Beziehung belongsTo ...

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

Jetzt möchte ich diese beiden Tabellen mit Eloquent with() verbinden, aber bestimmte Spalten aus der zweiten Tabelle haben. Ich weiß, dass ich den Query Builder verwenden kann, aber ich möchte es nicht. 

Wenn ich im Modell Post schreibe ...

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

Es führt die folgenden Abfragen aus ...

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'....));

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

123
Awais Qarni

Nun, ich habe die Lösung gefunden. Dies kann durch die Übergabe einer closure-Funktion in with() als zweiter Index eines Arrays geschehen

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

Es werden nur id und username aus einer anderen Tabelle ausgewählt. Ich hoffe das hilft anderen.


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

254
Awais Qarni

In Ihrem Modell Post

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

Ursprüngliche Gutschrift geht an Laravel Eager Loading - Nur bestimmte Spalten laden

60
user1669496

Wenn Sie in die andere Richtung gehen (hasMany):

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

Vergessen Sie nicht, den Fremdschlüssel anzugeben (vorausgesetzt es ist user_id in diesem Beispiel), um die Beziehung aufzulösen. Andernfalls erhalten Sie null Ergebnisse für Ihre Beziehung.

49
Thijs

Das können Sie in Laravel 5.5 so machen: 

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

Achten Sie auf das Feld id, wie in docs angegeben:

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

37
Adam

In Laravel 5.6 können Sie ein bestimmtes Feld wie folgt aufrufen

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

In Ihrem Post-Modell:

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

Jetzt können Sie $post->userWithName verwenden.

11
Duy Hoang

Wenn Sie nur eine Spalte aus der Tabelle benötigen, ist die Verwendung von "Listen" ziemlich nett. In meinem Fall rufe ich die Lieblingsartikel eines Benutzers ab, möchte aber 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
omar j

Ich bin auf dieses Problem gestoßen, aber mit einer zweiten Schicht verwandter Objekte. @Awais Qarnis Antwort hält mit der Aufnahme des entsprechenden Fremdschlüssels in die verschachtelte select-Anweisung durch. 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.

Post::with(['user' => function ($query) {
        $query->select('id','company_id', 'username');
    }, 'user.company' => function ($query) {
        $query->select('id', 'name');
    }])->get();

Wenn Sie außerdem bestimmte Spalten aus dem Post-Modell auswählen möchten, müssen Sie die user_id-Spalte in die select-Anweisung aufnehmen, um darauf zu verweisen.

Post::with(['user' => function ($query) {
        $query->select('id', 'username');
    }])
    ->select('title', 'content', 'user_id')
    ->get();
2
jwarshaw
EmployeeGatePassStatus::with('user:id,name')->get();
0
kush

Versuchen Sie dies, während Sie die Beziehung im Modell festlegen

$postdata = Post::with('user')->get();

$posdata = $postdata->map(function(posts){
    return collection([
        ............
        ...........

        'user' => $posts->user->map(function($user){
                'id' => $user->id,
                'username' => $user->username
                })

            ])
        })
0

Sie können auch Spalten für das verwandte Modell angeben, wenn Sie darauf zugreifen.

Post::first()->user()->get(['columns....']);

0

Versuchen Sie es mit Bedingungen.

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

Jetzt können Sie die pluckmethod für eine Collection-Instanz verwenden: 

Dies gibt nur das uuid-Attribut des Post model zurück.

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