2013-06-07 2 views
25

Я пытаюсь загрузить модель в laravel, но возвращать только некоторые столбцы. Я не хочу, чтобы вся загруженная таблица была представлена.Laravel Eager Загрузка - Загрузка только определенных столбцов

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

Я получаю следующее сообщение об ошибке:

log.ERROR: исключение 'Symfony \ Component \ Debug \ Exception \ FatalErrorException' с сообщением «Призыв к неопределенным метод Осветите \ Database \ красноречивый \ Коллекция :: getAndResetWheres()»

+0

-> получить ([ 'седловины', 'col2', 'col3']); –

ответ

49

воспользоваться методом select():

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

Примечание: Не забудьте добавить столбцы, назначенные внешнему ключу, сопоставляющему обе таблицы. Например, в моем примере я предположил, что Owner имеет Car, что означает, что столбцы, назначенные внешнему ключу, будут такими, как owners.id = cars.owner_id, поэтому мне пришлось добавить owner_id в список выбранных столбцов;

+1

К сожалению, это не работает для меня. Если я добавлю метод select(), то отношение не будет добавлено. Если я удалю его, я получу всю строку. – ipengineer

+8

О, вам, вероятно, нужен и внешний ключ. Например, если это «id», вам нужно добавить 'id' в столбцы' select() 'ed. – rmobis

+1

Я только что обновил оригинальный ответ, проверьте его сейчас. В принципе, если отношения 'Owner -> Car' установлены на' owner.id-> cars.owner_id', вы должны добавить 'owner_id' в список столбцов' select() ''ed. – rmobis

7

Также вам не нужно указывать получение определенных столбцов в модели и самого метода отношений ... Вы можете сделать это всякий раз, когда вам это нужно ... Как это:

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

Таким образом, вы также можете получить все столбцы соответствующей модели, если вам когда-либо понадобится.

+0

Я хотел бы добавить, что это работает для '$ q-> where()', а также если вы хотите загружать строки с столбцами, которые соответствуют определенным ограничениям. – WhyAyala

2

В контроллере вы должны делать что-то вроде

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

Предположив, что вы две модели определяется, как показано ниже

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

и

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

и у вас есть две таблицы что-то подобный:

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

и

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

Кредиты идут на документы: eloquent-relationships#eager-loading прокрутки к Нетерпеливые Загрузка Конкретные Колонки

Смежные вопросы