#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. вам не нужно создавать средство доступа для связи, если вы просто убедитесь, что оно загружено, оно будет в сериализованном выводе