Я изо всех сил пытаюсь разгадать концепцию hasManyThrough с laravel. У меня три таблицы:
Bookings -id (int) -some other fields Meta -id (int) -booking_id (int) -metatype_id (int) -some other fields MetaType -id (int) -name (string) -some other fields
То, что я пытаюсь получить, – это модель Eloquent, которая позволяет мне иметь отдельную запись с несколькими мета-записями типа MetaType. Я думал, что hasManyThrough, возможно, решил это, но теперь я думаю, что, возможно, это не самый лучший способ.
В моей модели бронирования у меня есть
public function bookingmeta() { return $this->hasMany('bookingmeta','booking_id'); } public function bookingmetatype() { return $this->hasManyThrough('bookingmetatype','bookingmeta','booking_id','bookingmetatype_id'); }
Но это не создает правильный SQL и не работает. я получил
select `new_bookingmetatype`.*, `new_bookingmeta`.`booking_id` from `new_bookingmetatype` inner join `new_bookingmeta` on `new_bookingmeta`.`bookingmetatype_id` = `new_bookingmetatype`.`id` where `new_bookingmeta`.`booking_id` in (57103)
В то время как то, что я действительно пытаюсь достичь,
select `new_bookingmetatype`.*, `new_bookingmeta`.`booking_id` from `new_bookingmetatype` inner join `new_bookingmeta` on `new_bookingmeta`.`id` = `new_bookingmetatype`.`bookingmetatype_id` where `new_bookingmeta`.`booking_id` in (57103)
Если кто-то может указать мне в правильном направлении, я бы очень признателен. Благодарю.
hasManyThrough
– это совсем не так. Он работает только для таких отношений:
A hasMany/hasOne B, B hasMany/hasOne C, then A hasManyThrough C (through B)
То, что у вас здесь, – это много для многих (принадлежит belongsToMany
), а meta
– сводная таблица.
Таким образом, вы можете сделать это (при условии, что meta
– это имя таблицы, Booking и MetaType – это модели):
// Booking model public function meta() { return $this->belongsToMany('MetaType', 'meta', 'booking_id', 'metatype_id') ->withPivot([ ARRAY OF FIELDS YOU NEED FROM meta TABLE ]); }
Затем вы можете получить доступ ко всем связанным MetaType:
$booking->meta; // collection of MetaType models
запросите его так (нетерпевая загрузка):
$booking = Booking::with(['meta' => function ($q) { // query related table $q->where('someFieldOnMetaTypeTable', 'someValue') // and / or pivot table ->wherePivot('someFieldOnMetaTable', 'anotherValue'); }])->first();
или установить ограничения на соответствующую таблицу для фильтрации бронирования:
$booking = Booking::whereHas('meta', function ($q) { // query related table $q->where('someFieldOnMetaTypeTable', 'someValue') // and / or pivot table ->where('meta.someFieldOnMetaTable', 'anotherValue'); })->first();
Примечание: wherePivot
работает только тогда, когда вы хотите загрузить отношения, поэтому вы не можете использовать его в whereHas
закрытии.