staudenmeir / eloquent-has-many-deep

Laravel Eloquent HasManyThrough relationships with unlimited levels
MIT License
2.67k stars 157 forks source link

Pivots not returned the same way #222

Closed utherp closed 10 months ago

utherp commented 10 months ago

I'm using hasManyDeepFromRelations, 2 deep, both with morphToMany: assume all classes use Permissible and extend Model with the below code:

trait Permissible {
    public function permitted_by() { return $this->morphToMany(Role::class, 'target', 'role_target'); }
    public function permitted_through_sets() {
        return $this->hasManyDeepFromRelations($this->in_sets(), (new Set()->permitted_by());
    }
}

abstract class Model extends \Illuminate\Database\Eloquent\Model {
     public function in_sets() { return $this->morphToMany(Set::class, 'target', 'set_target'); }
}

when I call permitted_by through a Set in tinker, I get this:

> $obj->in_sets[0]->permitted_by
= Illuminate\Database\Eloquent\Collection {#5149
    all: [
      App\Models\Role {#4174
        id: 1,
        name: "test1",
        created_at: null,
        updated_at: null,
        filler: null,
        pivot: Illuminate\Database\Eloquent\Relations\MorphPivot {#5148
          target_id: 2,
          role_id: 1,
          target_type: "App\Models\Set",
        },
      },
    ],
  }

but when I call permitted_through_sets, I get this:

> $obj->permitted_through_sets
= Illuminate\Database\Eloquent\Collection {#5126
    all: [
      App\Models\Role {#5130
        id: 1,
        name: "test1",
        created_at: null,
        updated_at: null,
        filler: null,
        laravel_through_key: 12,
      },
    ],
  }

I don't get the pivot object, which is kind of important. I tried adding a call to withPivot, this is what it returned:

> $obj->permitted_through_sets()->withPivot('target_id')
= Illuminate\Database\Eloquent\Collection {#5144
    all: [
      App\Models\Role {#5142
        id: 1,
        name: "test1",
        created_at: null,
        updated_at: null,
        filler: null,
        laravel_through_key: 12,
        target_id: Illuminate\Database\Eloquent\Relations\Pivot {#5151},
      },
    ],
  }

I just get a blank Pivot object on the property of the column name, rather than how it is normally returned, as a pivot object on the pivot property.

I do realize that the pivot may be ambiguous, but it should return at least the last pivot.

utherp commented 10 months ago

...I probably should have put this in discussions first.

staudenmeir commented 10 months ago

Hi @utherp, No worries.

Pass the name of the table to withPivot():

$obj->permitted_through_sets()->withPivot('TODO', ['target_id'])
                                           ^^^^
utherp commented 10 months ago

I did finally find the solution... I presumed the same signature as laravel's. thanks, this module is awesome! saves me so much extra b.s.