#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 — вы абсолютно правы. Не знаю, как я это пропустил… Спасибо!