Search code examples
laraveleloquenteloquent-relationship

Laravel: save / attach / sync custom pivot model (belongsToMany)


hope you're having a good day.

I'm using Laravel 8. I have three models and I need those models "entangled", so to speak.

So, I have three basic tables

areas,threats,positions
---
id
name

So the relationship needed is something like this:

  • Every t3 belongsToMany t1 and vice versa. (Many to Many)
  • Each t3.t1 relationship belongsToMany t2 (Many to Many)

My approach so far is this:

  • For the first relationship I have a belongsToMany realtionship defined on my models (t3.t1).
  • For the second relationship, I have created a custom pivot model for the pivot table, in that model I defined the second many to many relationship (t3t1.t2).

So far, the first relationship can be saved by doing $model->relatedModel()->attach($id);.

Now, for the second relationship, how can I attach the related models?

My last resort is to query the saved custom pivot model and attach the t2 model(s), but I wanted to ask first if there's a cleaner, eloquent-laravel way to do this.

Any advice would help. Thanks in advance for taking your time.


Solution

  • explanation

    the attach method is actually a Model function. so with your withPivot t3.t1 is not a model yet , when you are accessing with pivot magic method from your relation belongs to many it only return the column

    answers

    so for your situation, withPivot t3.t1 pivot as Model instance. here the steps

    1. create new PivotModel that extends use Illuminate\Database\Eloquent\Relations\Pivot;
    2. on the your t1Model, add using($classNamespace) to the belongsToMany method, example: belongsToMany()->using(PivotModel::class)
    3. then when t1->getT2s->pivot is already returning Model instance and you can use attach function to that pivot