Zeyukan Ich'
Zeyukan Ich'

Reputation: 693

Eloquent nested complex relationship

I have some trouble with chaining relationships. I want to chain three of them, but this is not working properly:

    return UserModel::with('cars.pieces.attributes')

I want to retrieve a user with its cars. He chose a car which have pieces and for each pieces he chose an attribute.

With only cars.pieces. I have my user, then the array of cars then the array of pieces for this car. When I add attributes, I have attributes not for pieces of cars of users but attributes for pieces whatever cars it is.

It seems like the relationship is only looking for the previous relation and not the whole packet.

    public function cars(){
        return $this->belongsToMany(CarsModel::class, 'user_cars', 'id_user','id_cars');
    }

Then

    public function pieces(){
        return $this->belongsToMany(PiecesModel::class, 'cars_pieces', 'id_cars','id_pieces')
    }

And finally :

    public function attributes(){
        return $this->belongsToMany(AttributeModel::class, 'user_cars_pieces_attributes', 'id_attribute', 'id_piece')
    }

The last entity is using 4 fields for the primary key :

id_user, id_car, id_attribute, id_piece

What could be a way to retrieve attributes for pieces of cars of the user?

Thank you for helping!

Upvotes: 1

Views: 40

Answers (1)

Robert Kujawa
Robert Kujawa

Reputation: 997

You can pass a function to your eager loading attributes:

return UserModel::with(['cars.pieces.attributes' => function ($query) {
    $query->where('id_user', DB::raw('users.id'))->where('id_car', DB::raw('cars.id'));
}]);

I haven't tested this but I think it should work.

Remember to import DB Facade: use Illuminate\Support\Facades\DB;

Upvotes: 1

Related Questions