2013-06-07 17 views
25

Próbuję wczytać model w laravel, ale zwracam tylko niektóre kolumny. Nie chcę, aby prezentowany był cały upragniony załadowany stół.Laravel Eager Loading - Ładuj tylko określone kolumny

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

otrzymuję następujący błąd:

log.ERROR: exception 'Symfony \ Komponent \ Debug \ \ FatalErrorException Wyjątek' z wiadomości „Zadzwoń do metody nieokreślone Illuminate \ database \ wymowny \ Collection :: getAndResetWheres()”

+0

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

Odpowiedz

49

użytkowania czynią metody select():

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

Uwaga: Pamiętaj, aby dodać kolumny przypisane do klucza obcego pasujące do obu tabel. Na przykład w moim przykładzie założyłem, że Owner ma Car, co oznacza, że ​​kolumny przypisane do klucza obcego byłyby podobne do owners.id = cars.owner_id, więc musiałem dodać owner_id do listy wybranych kolumn;

+1

Niestety to nie działa dla mnie. Jeśli dodaję metodę select(), relacja nie zostanie dodana. Jeśli go usunę, otrzymam cały wiersz. – ipengineer

+8

Och, prawdopodobnie potrzebujesz również klucza obcego. Na przykład, jeśli byłby to "id", musisz dodać "id" do kolumn ed "wybierz()". – rmobis

+1

Właśnie zaktualizowałem oryginalną odpowiedź, sprawdź teraz. Zasadniczo, jeśli relacja 'Owner -> Car' jest ustawiona na' owner.id -> cars.owner_id', musisz dodać 'owner_id' do listy kolumn' select() ''ed. – rmobis

7

Również nie trzeba określić uzyskanie konkretnych kolumn w modelu i samej metody związku ... Można to zrobić, kiedy trzeba go ... Jak to:

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

W ten sposób możesz również uzyskać wszystkie kolumny powiązanego modelu, jeśli kiedykolwiek będziesz tego potrzebować.

+0

Chciałbym dodać, że działa to również dla '$ q-> where()', jeśli chcesz mieć ochotę ładować wiersze z kolumnami pasującymi do pewnych ograniczeń. – WhyAyala

2

W kontrolerze należy robić coś podobnego

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

Przypuśćmy, że masz dwa modele zdefiniowane jak poniżej

<?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'); 
    } 
} 

i

<?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'); 
    } 
} 

i masz dwie tabele coś podobne:

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

i

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

kuponów iść do docs: eloquent-relationships#eager-loading przewinąć do Chętni Ładowanie Konkretne Kolumny

Powiązane problemy