Выборка данных из связанных таблиц в Laravel
Имеются таблицы в базе на автомобильную тематику:
marks
(id,name,alias)
models
(id,name,alias,mark_id)
в этих таблицах примерно такие данные:
$marksModels = [
'Tesla' => ['Model S','Model X'],
'Toyota' => ['Avensis','Prius New','iQ'],
'Mercedes-Benz' => ['B-Class'],
'BMW' => ['i3','1-Series','2-Series','3-Series'],
...
];
App\Models
class Mark extends Model {
protected $fillable = ['name','alias'];
public $timestamps = true;
public function carmodel(){
return $this->hasMany('App\Models\CarModel');
}
}
class CarModel extends Model {
protected $table = 'models';
protected $fillable = ['name','alias','mark_id'];
public function mark(){
return $this->belongsTo('App\Models\Mark');
}
}
И пытаюсь получить только нужные марки ['Tesla','BMW']:
public function index() {
$models = CarModel::with(['mark' => function($query){
$query->whereIn('name', ['Tesla','BMW']);
}])->get();
//$models = Mark::with('carmodel')->whereIn('name', ['Tesla','BMW'])->get();// та же ошибка
return view('admin.cars',[
'models' => $models,
]);
}
view
@if(count($models))
@foreach($models as $model)
{{ $model->mark->name }}
@endforeach
@endif
в результате ошибка:
Trying to get property 'name' of non-object (View:
формируется такой запрос:
select * from marks where marks.id in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) and name in ('Tesla', 'BMW')
Как правильно выбирать не все, а только нужные марки авто с предварительной загрузкой данных, т.е. с помощью model::with ?
Ответы (1 шт):
Автор решения: Xaku
→ Ссылка
Попробуйте вот так
$models = CarModel::with(['mark' => function($query){
$query->whereIn('name', ['Tesla','BMW']);
}])->whereHas('mark', function($query){
$query->whereIn('name', ['Tesla','BMW']);
})->get();