Подтвердить что ты не робот

Laravel Eager Loading - Загрузка только определенных столбцов

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

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

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

log.ERROR: исключение "Symfony\Component\Debug\Exception\FatalErrorException" с сообщением "вызов метода undefined Illuminate\Database\Eloquent\Collection:: getAndResetWheres() '

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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-relations # eager-loading, прокрутить до Eager Загрузка определенных столбцов

Ответ 4

Попробуйте условия WITH() и WHERE().

$user_id = 1; // for example

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

Ответ 5

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

public function car(){
    return $this->hasOne('Car', 'id');
}

затем, когда вы хотите загрузить отношение, выберите только выбранные столбцы

$owner = $this->owner
->where('id', 23)
->with('car:id,owner_id,emailid,name')   //no space after comma(, ) and id has to be selected otherwise it will give null

Надеюсь, что это работает, хорошего дня.