CakePHP Saving имеет много ассоциаций

У меня есть продукт, который должен сохранить путь к изображению в другой таблице. product hasMany images,

Это мое add()

if ($this->request->is('post')) {
// https://book.cakephp.org/3.0/en/orm/saving-data.html#saving-associations
$save = $this->Products->newEntity(
$this->request->getData(),
['associated'=>$associated]
);

$this->log('JUST AFTER PATCH'.$save);
$save->last_modified = Time::now();
$save->created = Time::now();

//sort out assoc.
$path = $this->saveImageGetPath($this->request->data['images']);

$save['images'][] = [
'path' => $path,
'alt_description' => $product->name . Time::now() . 'img',
'position' => $this->request->data['position']
];

$save->isDirty(true);
$this->log('JUST BEFORE SAVE'.$save);
if ($this->Products->save($save, [
'associated'=> ['Shoes', 'Images', 'Products_has_categories']
])) {

Это вывод массива в лог

{
"name":"xlc",
"brands_id":1,
"description":"csvfd",
"type":"s",
"position":"0",
"shoe":{
"heels_id":1,
"closures_id":1,
"materials_upper_id":1,
"materials_lining_id":1,
"materials_sole_id":1
},
"products_has_categories":{
"categories_id":"1"},
"images":[
{
"path":"\/webroot\/img\/products\/img1503289958.jpg",
"alt_description":"8\/21\/17, 4:32 AMimg",
"position":"0"}
],
"last_modified":"2017-08-21T04:32:38+00:00",
"created":"2017-08-21T04:32:38+00:00"}

Это стол Image конф.

$this->hasMany('Images', [
'foreignKey' => 'products_id',
'dependent' => true,
]);

Изображения загружаются нормально, и вы можете получить путь. Это просто не вызывает оператор SQL для этого, и я озадачен, почему
Обратите внимание, что hasOne конф. работает, так что я могу сохранить доц. но не с этим hasMany

0

Решение

Вы добавляете изображение в виде массива к данным, который не будет работать, ORM будет сохранять только объекты сущностей, т.е. вам нужно создать экземпляр \Cake\Datasource\EntityInterface вместо этого (это то, что процесс создания / исправления объекта будет делать автоматически для переданных данных).

$save['images'][] = $this->Products->Images->newEntity([
'path' => $path,
'alt_description' => $product->name . Time::now() . 'img',
'position' => $this->request->data['position']
]);

Также вы должны убедиться, что images свойство помечается как грязное, иначе ORM будет игнорировать его (это также делается автоматически в процессе создания / исправления сущности). Ваш isDirty(true) звонок ничего не сделает, так как isDirty() не сеттер, а геттер.

$save->setDirty('images', true); // use dirty('images', true) in CakePHP < 3.4

Кроме того, вместо регистрации представлений JSON лучше использовать debug(), или по крайней мере var_export() вместо этого, чтобы сохранить отладочную информацию, которую предоставляет объект.

Смотрите также

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector