2013-06-07 23 views
25

Ich versuche eifrig ein Modell in Laravel zu laden, aber nur bestimmte Spalten zurückgeben. Ich möchte nicht, dass der ganze eifrig geladene Tisch präsentiert wird.Laravel Eager Loading - Laden nur bestimmte Spalten

public function car() 
{ 
    return $this->hasOne('Car', 'id')->get(['emailid','name']); 
} 

Ich erhalte die folgende Fehlermeldung:

log.ERROR: Ausnahme 'Symfony \ Component \ Debug \ Exception \ FatalErrorException' mit der Meldung ‚Call to undefined Methode Illuminate \ Database \ Eloquent \ Collection :: getAndResetWheres()‘

+0

-> get ([ 'col', 'col2', 'col3']); –

Antwort

49

nutzen Sie die select() Methode:

public function car() { 
    return $this->hasOne('Car', 'id')->select(['owner_id', 'emailid', 'name']); 
} 

Hinweis: Denken Sie daran, die dem Fremdschlüssel zugeordneten Spalten hinzuzufügen, die mit beiden Tabellen übereinstimmen. Zum Beispiel nahm ich in meinem Beispiel an, dass ein Owner einen Car hat, was bedeutet, dass die dem Fremdschlüssel zugewiesenen Spalten etwas wie owners.id = cars.owner_id wären, also musste ich owner_id zu der Liste ausgewählter Spalten hinzufügen;

+1

Leider funktioniert das nicht für mich. Wenn ich die select() -Methode hinzufüge, wird die Beziehung nicht hinzugefügt. Wenn ich es entferne, bekomme ich die ganze Reihe. – ipengineer

+8

Oh, wahrscheinlich brauchst du auch den Fremdschlüssel. Wenn es zum Beispiel "id" wäre, müssten Sie den Spalten "select()' ed "id" hinzufügen. – rmobis

+1

Ich habe gerade die ursprüngliche Antwort aktualisiert, überprüfen Sie es jetzt. Wenn die Beziehung Owner -> Car auf "owners.id -> cars.owner_id" gesetzt ist, müssen Sie "owner_id" zur Spalte "select()" hinzufügen. – rmobis

7

Auch brauchen Sie nicht in das Modell immer bestimmte Spalten zu spezifizieren und die Beziehung Methode selbst ... Sie können das tun, wenn Sie es brauchen ... So:

$owners = Owner:: 
      with([ 
      'car' => function($q) 
      { 
      $q->select('id', 'owner_id', 'emailid', 'name'); 
      }, 
      'bike' => function($q) 
      { 
      $q->select('id', 'owner_id', 'emailid', 'name'); 
      } 
      ])-> 
      get(); 

Auf diese Weise Sie können auch alle Spalten des zugehörigen Modells abrufen, wenn Sie es jemals benötigen.

+0

Ich möchte hinzufügen, dass dies auch für '$ q-> where()' funktioniert, wenn Sie eifrig Zeilen mit Spalten laden möchten, die bestimmte Bedingungen erfüllen. – WhyAyala

2

In Ihrem Controller sollten Sie so etwas wie

App\Car::with('owner:id,name,email')->get(); 

Nimmt man tun, dass Sie haben zwei Modelle wie unten definiert

<?php 
namespace App; 
use Illuminate\Database\Eloquent\Model; 

class Car extends Model 
{ 
    protected $table = 'car'; 

    public function owner() 
    { 
     return $this->belongsTo('App\Owner', 'owner_id'); 
    } 
} 

und

<?php 
namespace App; 
use Illuminate\Database\Eloquent\Model; 

class Owner extends Model 
{ 
    protected $table = 'owner'; 

    public function car() 
    { 
     return $this->hasMany('App\Car', 'owner_id'); 
    } 
} 

und Sie haben zwei Tabellen etwas wie:

gehen
owners: id | name | email | phone | other_columns... 

und

cars: id | owner_id | make | color | other_columns... 

Credits der Dokumentation: eloquent-relationships#eager-loading Blättern zu Eager Loading bestimmte Spalten

Verwandte Themen