У меня есть продукт, который должен сохранить путь к изображению в другой таблице. 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
Вы добавляете изображение в виде массива к данным, который не будет работать, 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()
вместо этого, чтобы сохранить отладочную информацию, которую предоставляет объект.
Смотрите также
Других решений пока нет …