Cakephp 3.0 Сохранить связанную модель
Я изучаю cakePHP 3.0, и у меня возникли проблемы с сохранением связанных данных в моей модели.
Я пытаюсь сохранить клиента со связанными данными ClientPreferences
ClientTable
class ClientsTable extends Table
{
public function initialize(array $config)
{
(...)
$this->belongsTo('ClientPreferences', [
'foreignKey' => 'client_preferences_id'
]);
}
}
ClientController
$aClient = $this->Clients->newEntity();
$aClient = $this->Clients->patchEntity($aClient, $this->request->data);
$aClientPreference = $this->Clients->ClientPreferences->newEntity();
$aClientPreference->my_field = 'my value';
$aClient->ClientPreferences = $aClientPreference;
$this->Clients->save($aClient, ['associated' => ['ClientPreferences']];
Сущность Client правильно сохраняется, но не связанная с ней сущность ClientPreferences, и Cake не выдает ошибку.
Я пытался следовать этому: http://book.cakephp.org/3.0/en/orm/saving-data.html
Но не нашли никаких проблем, чтобы сделать это правильно. У кого-нибудь есть совет?
Заранее спасибо.
1 ответ
Конвенции, конвенции, конвенции
Ясно, что есть разница в примерах, которые вы связали, присмотритесь к именам свойств, и если вы прокрутите немного дальше, вы найдете объяснение специально для belogsTo
ассоциации.
При сохранении ассоциаций ownTo ORM ожидает отдельную вложенную сущность в единственной подчеркнутой версии имени ассоциации. Например: [...]
Кулинарная книга> Сохранение данных> Сохранение принадлежности к ассоциациям
Таким образом, для belongsTo
ассоциации, имя свойства по умолчанию ожидается в нижнем регистре и подчеркивании, т.е. $aClient->client_preference
,
Ваш внешний ключ должен быть кстати. быть в единственном числе, чтобы соответствовать соглашениям, т.е. client_preference_id
, хотя это просто имя свойства, вызывающее проблему.
См. Также Поваренная книга> Ассоциации> Ассоциации BelongsTo (особенно foreignKey
а также propertyName
опции)
Если у вас есть дополнительные данные joinData для сохранения, проверьте это:Cakephp 3 - Сохранить связанный файл ownToMany (joinTable)
В инструкции по этому поводу нет объяснения!