質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

0回答

916閲覧

CakePHP4 アソシエーション先の変更&追加ができない

MKannna

総合スコア4

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2021/04/13 06:08

編集2021/04/15 03:52

前提

class GoodsTable extends Table{ $this->hasMany('FStatesGoods', [ 'foreignKey' => 'good_id', ]); $this->hasMany('GoodsTags', [ 'foreignKey' => 'good_id', ]); } class FStatesTable extends Table{ $this->hasMany('FStatesGoods', [ 'foreignKey' => 'f_state_id', ]); } class FStatesGoodsTable extends Table{ $this->belongsTo('FStates', [ 'foreignKey' => 'f_state_id', ]); $this->belongsTo('Goods', [ 'foreignKey' => 'good_id', ]); } class TagsTable extends Table{ $this->hasMany('GoodsTags', [ 'foreignKey' => 'tag_id', ]); } class GoodsTagsTable extends Table{ $this->belongsTo('Goods', [ 'foreignKey' => 'good_id', 'joinType' => 'INNER', ]); $this->belongsTo('Tags', [ 'foreignKey' => 'tag_id', 'joinType' => 'INNER', ]); }
data = [id] => 30 [title] => 'kkkkkkkkk' [f_states_goods] => Array( [0] => Array( [id] => 1 [name] => 'aaaaaaa' ) [1] => Array ( [id] => 10 [name] => 'qqqqqqqqqq' ) ) [goods_tas] => Array( [0] => Array ( [name] => 1 ) [1] => Array ( [name] => 1 ) [2] => Array ( [name] => 1 ) )
class FoodsController extends AppController { public function edit($id = null) { $data = $this->request->getData(); $goods = TableRegistry::getTableLocator()->get('Goods'); $goo = $goods->get($id,['contain'=>["FStatesGoods","GoodsTags"]]); $goo = $goods->patchEntity($goo,$data,[ 'associated' => ["FStatesGoods","GoodsTags"] ]); } }

実現したいこと

上記の$dataを更新したいのですが、patchEntityすると以下のようになってしまいます。
[goods_tags]は全て新規追加
[f_states_goods]は変更なのですが、
id=10に関しては、good_id=20->30に変更してなおかつnameも変更したいデータですが
除外されてしまいます。

ちなみに、現在のControllerはFoodsですが、Goodsテーブルのカテゴリ毎に処理が変わるため
Controllerが別となっています。

Debug: App\Model\Entity\Good Object ( [id] => 30 [title] => kkkkkkkkk [goods_tags] => Array ( ) [f_states_goods] => Array ( [0] => App\Model\Entity\FStatesGood Object ( [id] => 1 [f_state_id] => 10 [good_id] => 30 [name] => 'aaaaaaa' [[new]] => [[accessible]] => Array ( [f_state_id] => 1 [good_id] => 1 [f_state] => 1 [good] => 1 ) ..... [[repository]] => FStatesGoods ) ) [[new]] => [[accessible]] => Array ( [name] => 1 [f_states] => 1 [tags] => 1 ) ..... [[repository]] => Goods )

試したこと

$goo = $goods->newEntity($data,[ 'associated' => ["FStatesGoods","GoodsTags"] ]); アソシエーション先は全てマージされませんでした。 $goo = $goods->patchEntity($goo,$data,[ 'checkExisting' => false, 'validate' => false, 'associated' => ["FStatesGoods","GoodsTags"] ]); リクエストデータを以下のように変更してみました data = [f_states_goods] => Array ( [0] => Array ( [id] => 1 [name] => 'aaaaaaa' ) [1] => Array ( [id] => 10 [name] => 'qqqqqqqqqq' ) [_ids] => Array ( [0] => 10 ) ) としてみたり data = [f_states_goods] => Array (       [_ids]=> [0] => Array ( [id] => 1 [name] => 'aaaaaaa' ) [1] => Array ( [id] => 10 [name] => 'qqqqqqqqqq' ) ) としてみたりしましたが、結果は変わりませんでした。

こちらをを見ながら、色々試してみたのですが、
何が原因で変更&追加分のデータが除外されてしまうのかが全くわかりませんでした。
ご教授のほどよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問