Laravel Нетерпеливая Загрузка - Загружайте только определенные столбцы


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

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

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

Журнал.ОШИБКА: исключение "Symfony\Компонент\Отладка\Исключение\Исключение фатальной ошибки" с сообщением "Вызов неопределенного метода Illuminate\База данных\Красноречивый\Коллекция::Getandresetwheres()"

Author: ipengineer, 2013-06-08

3 answers

Используйте метод select():

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

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

 52
Author: rmobis, 2013-06-08 02:35:29

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

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

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

 10
Author: Ali, 2015-12-01 11:29:00

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

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...

Кредиты идут в документы: красноречивые отношения#нетерпеливая загрузка прокрутите до Нетерпеливая загрузка определенных столбцов

 3
Author: Bogdan, 2017-12-20 08:36:35