Выборка данных из связанных таблиц в 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();
→ Ссылка