【问题标题】:CakePHP Saving hasMany associationCakePHP 保存 hasMany 关联
【发布时间】:2017-08-21 04:41:22
【问题描述】:

我的产品需要将图像路径保存到另一个表。 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 assoc 的表格。

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

图片上传正常,您可以获取路径。它只是没有为此触发 SQL 语句,我很困惑为什么 请注意,hasOne assoc。确实有效,所以我可以保存 assoc。但不是这个hasMany

【问题讨论】:

    标签: php cakephp orm associations cakephp-3.x


    【解决方案1】:

    您将图像作为数组添加到数据中,这是行不通的,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() 不是setter,而是getter。

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

    此外,您最好使用debug() 或至少var_export(),而不是记录 JSON 表示,以保留实体提供的调试信息。

    另见

    【讨论】:

    • 你是神,非常感谢。这是完美的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多