Laravel hasManyThrough

Я изо всех сил пытаюсь разгадать концепцию 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 закрытии.