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

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

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

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

Q&A

解決済

1回答

3107閲覧

CakePHP3で一括更新・新規追加を行う

ssk

総合スコア332

CakePHP

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

0グッド

0クリップ

投稿2017/03/09 09:12

編集2017/03/09 13:35

前回の質問でアソシエーションを利用した更新・新規追加を行っています。
何度やっても更新はされず、新規登録になってしまうため、ご教授いただきたいです。

PHP

1//edit.php 2echo $this->Form->input('dalcheckbox15s.0.dal15_id',[ 345

PHP

1 $datacklist = $this->Datacklists->patchEntity($datacklist, $this->request->data,['associated' => ['Dalcheckbox15s']]);

PHP

1//debug($datacklist); 2'dalcheckbox15s' => [ 3 (int) 0 => object(Cake\ORM\Entity) { 4 5 'dal15_id' => (int) 1, 6 '[new]' => true, 7 '[accessible]' => [ 8 '*' => true 9 ], 10 '[dirty]' => [ 11 'dal15_id' => true 12 ], 13 '[original]' => [], 14 '[virtual]' => [], 15 '[errors]' => [], 16 '[invalid]' => [], 17 '[repository]' => 'Dalcheckbox15s' 18 19 } 20 ],

idを渡してあげればいいのでしょうか?
その場合、どのようにidを渡すのかも教えていただけると助かります。。

######少し前進
このように書くとid1が更新されました。

PHP

1foreach($this->request->data['dalcheckbox15s'][0] as $key => $value){ 2 $this->request->data['dalcheckbox15s'][0] = [ 3 'id' => 1, 4 'datacklists_id' => $id, 5 'dal15_id' => $value, 6 ]; 7 }

'id' => 1,をテーブルから参照して動的に生成できれば、、、

#####追記

PHP

1//debug($datacklist) 2'[original]' => [ 3 'dalcheckbox15s' => [ 4 (int) 0 => object(Cake\ORM\Entity) { 5 6 'id' => (int) 1, 7 'datacklists_id' => (int) 22488, 8 'dal15_id' => (int) 1, 9 '[new]' => false, 10 '[accessible]' => [ 11 '*' => true 12 ], 13 '[dirty]' => [], 14 '[original]' => [], 15 '[virtual]' => [], 16 '[errors]' => [], 17 '[invalid]' => [], 18 '[repository]' => 'Dalcheckbox15s' 19 20 }, 21 (int) 1 => object(Cake\ORM\Entity) { 22 23 'id' => (int) 2, 24 'datacklists_id' => (int) 22488, 25 'dal15_id' => (int) 2, 26 '[new]' => false, 27 '[accessible]' => [ 28 '*' => true 29 ], 30 '[dirty]' => [], 31 '[original]' => [], 32 '[virtual]' => [], 33 '[errors]' => [], 34 '[invalid]' => [], 35 '[repository]' => 'Dalcheckbox15s' 36 37 } 38 ] 39 ],

'id' => (int) 1,
'id' => (int) 2,
この2つの情報を

'id' => 1,のところに入れてあげればいいかと思うのですが
方法はございますか?

PHP

1$this->request->data['dalcheckbox15s'][0] = [ 2 'id' => 1, 3 'datacklists_id' => $id, 4 'dal15_id' => $value, 5 ];

######追記
アソシエーションした意味がないような気がすうのですが
下記で一旦全て削除してからインサートはできるようになりました。

PHP

1$i = 0; 2 foreach($dal15s as $key => $value){ 3 $this->request->data['dalcheckbox15s'][$i] = [ 4 'datacklists_id' => $id, 5 'dal15_id' => $value, 6 ]; 7 $i++; 8 } 9 $datacklist = $this->Datacklists->patchEntity($datacklist,$this->request->data);

やりたいことは、「CakePHP3で一括更新・新規追加を行う」なので、分かる方は助言いただけると幸いです。
よろしくお願いいたします。

######追記
アソシエーション定義

PHP

1$this->hasMany('Dalcheckbox15s', [ 2 'joinTable' => 'dalcheckbox15s', 3 'foreignKey' => 'datacklists_id', 4 'targetForeignKey' => 'dal15_id', 5 'joinType' => 'LEFT', 6 'saveStrategy' => 'replace', 7 ]);

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

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

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

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

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

popobot

2017/03/09 13:33 編集

どういうアソシエーションなのでしょうか? アソシエーションを定義しているコードを記載してください。
ssk

2017/03/09 13:35

アソシエーションの定義を追記いたしました。
popobot

2017/03/09 13:39

belongsToManyではなくhasManyがいいんですか?
ssk

2017/03/09 13:45

1対多の関係だったのでhasManyを選択しました。
popobot

2017/03/09 13:46

$datacklistはどのように取得したものなのでしょうか
ssk

2017/03/09 13:47

3テーブルなのでbelongsToManyの方が正解でしょうか?
ssk

2017/03/09 14:21

>>>$datacklistはどのように取得したものなのでしょうか  $datacklist = $this->Datacklists->get($id, [ 'contain' => [''Dalcheckbox15s'] ]);
ssk

2017/03/09 14:21

このように取得しております。
popobot

2017/03/09 20:17

使い方しだいなのでどちらが正解というものでもないです。コードはあってそうに見えますけどね...
ssk

2017/03/10 02:39

belogsToManyの方がコードは少なくなるような気がしています。コードは合っていますか、、
ssk

2017/03/10 04:39

belogsToManyで実現することができました!
ssk

2017/03/10 04:39

ありがとうございます><
guest

回答1

0

自己解決

PHP

1$dal11s = filter_input(INPUT_POST, 'daldata11s', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY); 2$dal15s = filter_input(INPUT_POST, 'daldata15s', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY); 3$dal16s = filter_input(INPUT_POST, 'daldata16s', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);

アソシエーション先の指定のミスでdaldata1dalcheckboxに変更したところ、できました。

投稿2017/03/10 04:45

ssk

総合スコア332

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問