Laravel: получить атрибуты связанной полиморфной модели (морфона)

#php #laravel #eloquent-relationship

Вопрос:

Предположим, у меня есть модель пользователя (таблица»пользователи» = > идентификатор, электронная почта, идентификатор пользователя, тип пользователя) и модель клиента (таблица»клиенты» = > > идентификатор, имя и т. Д., Не важные поля).

Пользовательская модель имеет следующее:

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

Модель клиента имеет следующее:

 public function user()
{
   return $this->morphOne('AppModelsUser', 'userable');
}
 

Все работает нормально, когда я создаю нового клиента и назначаю ему учетную запись пользователя следующим образом:

 $customer->user()->save($user);
 

Однако, когда я пытаюсь получить информацию о пользователе для конкретного клиента, как это:

 $customer = Customer::findOrFail($id);
dd($customer->user());
 

Я ожидаю, что в нем будет какая-либо информация о соответствующей учетной записи пользователя для конкретного клиента. Но он ничего не возвращает! dd возвращает следующее:

 IlluminateDatabaseEloquentRelationsMorphOne {#1488 ▼
 #morphType: "users.userable_type"
 #morphClass: "AppModelsCustomer"
 #foreignKey: "users.userable_id"
 #localKey: "id"
 #query: IlluminateDatabaseEloquentBuilder {#1493 ▶}
 #parent: AppModelsCustomer {#1487 ▶}
 #related: AppModelsUser {#1494 ▼
   #fillable: array:3 [▶]
   #hidden: array:2 [▶]
   #casts: array:1 [▶]
   #connection: "mysql"
   #table: null
   #primaryKey: "id"
   #keyType: "int"
    incrementing: true
   #with: []
   #withCount: []
   #perPage: 15
    exists: false
    wasRecentlyCreated: false
   #attributes: []
   #original: []
   #changes: []
   #classCastCache: []
   #dates: []
   #dateFormat: null
   #appends: []
   #dispatchesEvents: []
   #observables: []
   #relations: []
   #touches: []
    timestamps: true
   #visible: []
   #guarded: array:1 [▶]
   #rememberTokenName: "remember_token"
 }
 #isOneOfMany: false
 #relationName: null
 #withDefault: null
 

Что я делаю не так? Просмотрел несколько тем о переполнении стека и тщательно отредактировал документацию Laravel, но просто не могу понять, в чем дело…

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

1. Я думаю , что вместо $customer->user()->save($user); вас следует использовать associate , т. е.: $customer->user()->associate($user);

2. на самом деле, эта часть работает нормально, так как база данных содержит всю необходимую информацию. users.userable_id имеет идентификатор клиента, а users.userable_type имеет /Приложение/Модель/Клиента, так что, похоже, все в порядке. Тем не менее, спасибо, я постараюсь использовать ассоциацию вместо сохранения и в будущем.

3. Взглянув еще раз, я думаю, что вам следует сделать dd($customer->user); , чтобы загрузить данные, которые вы использовали бы в скобках, если бы хотели что-то сделать с отношением, например, добавить дополнительное предложение where или что-то в этом роде.

4. @alistaircol — вы абсолютно правы. Не знаю, как я это пропустил… Спасибо!