I'm struggling to get my head around a hasManyThrough concept with laravel. I have three tables:
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
What I am trying to get is an Eloquent model that allows me to have a single booking record with multiple Meta records of type MetaType. I thought that hasManyThrough might have solved this, but now I am thinking that perhaps this is not the best way.
In my booking model I have
public function bookingmeta() {
return $this->hasMany('bookingmeta','booking_id');
}
public function bookingmetatype() {
return $this->hasManyThrough('bookingmetatype','bookingmeta','booking_id','bookingmetatype_id');
}
But this fails to generate the correct SQL and fails. I get
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)
Whereas what I am really trying to achieve is
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)
If anyone can point me in the right direction I'd really appreciate it. Thanks.
hasManyThrough
is not the way at all. It works only for relations like this:What you have here is a many to many (
belongsToMany
), withmeta
being the pivot table.So you can do this (assuming
meta
is table name, Booking and MetaType are models):Then you can access all associated MetaType:
query it like this (eager loading):
or set constraints on the related table to filter the Booking:
Note:
wherePivot
works only when you eager load the relationship, so you can't use it inwhereHas
closure.