Laravel Eloquent HasManyThrough through 3 tables with pivot tables

63 Views Asked by At

I need to make a list of scopes from my positions->areas->scopes on my Booking Model.

My tables look like that:

Booking
    id
    ...

Position
    id
    booking_id
    ...

Area
    id
    ..

Position_areas
    id
    area_id
    position_id

Scope
    id
    ...

Area_Scopes
    id
    area_id
    scope_id

And this are my relations:

class Booking extends Model
{
...
     public function positions()
     {
          return $this->hasMany(BookingPosition::class);
     }

    public function areas()
    {
         return $this->hasManyThrough(Area::class, PositionsAreas::class, 'area_id', 'id',    'position_id', 'area_id');
    }


...
}
class BookingPosition extends Model
{
...
    public function booking()
    {
        return $this->belongsTo(Booking::class);
    }

    public function areas()
    {
        return $this->belongsToMany(Area::class, 'position_areas', 'position_id', 'area_id')
            ->using(PositionsAreas::class);
    }

...
}
class PositionsAreas extends Pivot
{
...
    protected $table = 'position_areas';

    public function positions(){
        return $this->belongsTo(BookingPosition::class);
     }
 
     public function areas(){
         return $this->belongsTo(Area::class);
     }
...
}
class Area extends Model
{
...
    public function bookingPositions()
    {
        return $this->belongsToMany(
            BookingPosition::class
        )->using(PositionsAreas::class);
    }

    public function scopes()
    {
        return $this->belongsToMany(Scope::class, table: 'scope_areas');
    }
...
}

class Scope extends Model
{
...

    public function areas(){
        return $this->belongsToMany(Area::class, table: 'scope_areas');
    }
...
}

And I want to have a list of all areas on my booking model, but I don't know how to achieve that.

So that I can do something like that

...

$booking->load('scopes');

[
    id
    date
    ...
    scopes => [
        {...},
        {...}

    ]
]
    

I tried to create pivot models for position_areas but i cant even get a list of areas on my booking model.

1

There are 1 best solutions below

0
23nr1 On

I couldn't figure out how to solve this with a relation like hasManyThrough but as workaround I make all scopes available in my $bookings like that.

$booking = Booking::find($booking->id);
$booking->scopes = $booking->positions
                           ->pluck('areas')
                           ->flatten()
                           ->pluck('scopes')
                           ->flatten()
                           ->pluck('name')
                           ->unique()
                           ->values()
                           ->all();