Laravel: Неопределенное свойство при доступе к родителю от ребенка через полиморфную связь

#php #laravel #eloquent #polymorphic-associations

Вопрос:

У меня есть три модели: Магазин, Лаборатория и Инвентарь. Инвентарь может принадлежать любому из них через полиморфную связь.

 class Store extends Model
{
    public function inventory()
    {
        return $this->morphOne(AppModelsInventory::class, 'keeper');
    }
}


class Lab extends Model
{
    public function inventory()
    {
        return $this->morphOne(AppModelsInventory::class, 'keeper');
    }
}


class Inventory extends Model
{
    protected $appends = ['keeper'];

    public function keeper()
    {
        return $this->morphTo();
    }

    public function getKeeperAttribute()
    {
        return $this->keeper;
    }
}
 

Когда я пытаюсь получить доступ к родителю из экземпляра инвентаризации, используя свойство «хранитель» , я получаю следующее

 Undefined property: App\Models\Inventory::$keeper
 

У меня есть keeper_id и keeper_type на моей inventories таблице, и данные вставляются просто отлично с вложенными отношениями.

 Schema::create('inventories', function (Blueprint $table) {
        $table->id();
        $table->string('name')->nullable();
        $table->unsignedBigInteger('keeper_id')->nullable();
        $table->string('keeper_type')->nullable();
        $table->timestamp('created_at')->useCurrent();
        $table->timestamp('updated_at')->nullable()->useCurrentOnUpdate();
});
 

dd($this->keeper()); возвращает отношение правильно:

 IlluminateDatabaseEloquentRelationsMorphTo {#1326 ▼
  #morphType: "keeper_type"
  #models: null
  #dictionary: []
  #macroBuffer: []
  #morphableEagerLoads: []
  #morphableEagerLoadCounts: []
  #morphableConstraints: []
  #child: AppModelsInventory {#1302 ▶}
  #foreignKey: "keeper_id"
  #ownerKey: "id"
  #relationName: "keeper"
  #query: IlluminateDatabaseEloquentBuilder {#1321 ▶}
  #parent: AppModelsInventory {#1302 ▶}
  #related: AppModelsStore {#1305 ▶}
  #withDefault: null
}
 

Так почему же это не $this->keeper; работает? В чем может быть проблема?

Комментарии:

1. попробуйте изменить имя отношения или имя свойства с keeper на что-то другое

2. Да, похоже, в этом и заключалась проблема. Мне пришлось использовать другое имя свойства, чтобы оно работало. Спасибо.

3. вам не нужно создавать средство доступа для связи, если вы просто убедитесь, что оно загружено, оно будет в сериализованном выводе