Невозможно сохранить связанные (hasOne) данные

#cakephp #cakephp-4.x

#cakephp #cakephp-4.x

Вопрос:

Я создаю простой API с помощью CakePHP 4, и у меня возникают некоторые проблемы с сохранением некоторых данных POST. Это новый проект, поэтому модели недавно созданы на основе моих 3 таблиц: , elaborations details , jobs

ElaborationTable Таблица имеет следующие отношения:

 $this->hasOne('Details', [ // this (and the next) is the only thing that I've manually  changed here: hasOne instead of hasMany
    'foreignKey' => 'elaboration_id',
]);
$this->hasOne('Jobs', [
    'foreignKey' => 'elaboration_id',
]);
 

В то время как оба DetailsTable и JobsTable имеют это:

 $this->belongsTo('Elaborations', [
    'foreignKey' => 'elaboration_id',
    'joinType' => 'INNER',
]);
 

В моем контроллере это то, что я использую для извлечения данных POST и сохранения их в каждой таблице базы данных:

 $data = $this->request->getData();
$data['user_id'] = $this->Auth->user('id');

$elaboration = $this->Elaborations->newEntity($data, [
    'associated' => [
        'Details',
        'Jobs'
    ]
]);
 

Наконец, мои данные POST выглядят примерно так:

 APP/Controller/ElaborationsController.php (line 85)
[
    'detail' => [
        'regione' => 'Lazio',
        'provincia' => 'RM',
        'comune' => 'Roma',
    ],
    'job' => [
        'serramenti' => '1',
    ],
    'user_id' => (int) 2,
]
 

Теперь user_id поле сохраняется в моей elaborations таблице, ошибок не выдается, но details jobs таблицы and по-прежнему остаются пустыми, данные не сохраняются.

Что я делаю не так?

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

1. Доступны detail ли и job в вашем объекте разработки?

2. Черт, ты заставил меня увидеть проблему. Те значения, которые доступны, но во множественном числе details и jobs . Это потому, что команда bake написала это таким образом… Я установил для него значение detail и job , и теперь оно работает. Большое спасибо!

3. К вашему сведению, bake не может различить hasOne и hasMany , поскольку в обоих случаях внешний ключ находится в целевой таблице, а расположение внешнего ключа — единственный намек на определение типа ассоциации. Из-за этого bake будет пытаться только обнаружить hasMany , и таким образом вы получите имена во множественном числе.

4. Я предполагаю, что, возможно, bake может проверить наличие уникального индекса во внешнем ключе, если он присутствует, тогда можно предположить, что это должна быть hasOne ассоциация.

5. @ndm автоматизировать его с помощью уникального индекса было бы неплохо, но, на мой взгляд, это не имеет большого значения, я виноват, что пропустил это … возможно, добавления простого комментария, объясняющего, что нужно изменить для hasOne ассоциаций, было бы достаточно даже для невнимательных людей, как я был сегодня-