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() '
Ответы
Ответ 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
Надеюсь, что это работает, хорошего дня.