2017-08-21 28 views
0

私は別のテーブルに画像パスを保存する必要がある製品を持っています。 product hasMany imagesCakePHP保存hasManyアソシエーション

これは私の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'] 
    ])) { 

ですこれはこれは、テーブルImage連想され、ログに

{ 
    "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" 
} 

アレー出力です。

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

画像が正常にアップロードされ、パスを取得できます。これはSQLステートメントをトリガーしていないだけなのですが、私は理由について困惑しています 注意してください、それはhasOne assocです。私はassocを保存することができますので、動作します。これではなくhasMany

答えて

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'] 
]); 

また、あなたはそれ以外の場合はORM(つまり、プロセスにパッチを適用/エンティティの作成中に自動的に行われています)、それを無視するようimagesプロパティは、ダーティとしてマークされていることを確認する必要があります。あなたのisDirty(true)コールは何もしません。isDirty()はセッターではなく、ゲッターです。

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

また代わりに、ロギングJSON表現の、あなたはより良いエンティティが提供するデバッグ情報を保持するために、代わりにdebug()、または少なくともvar_export()を使用しています。

あなたは神です

+0

も参照してください、ありがとうございました。それは完璧な答えです – mewc

関連する問題