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

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

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

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

Q&A

解決済

1回答

1403閲覧

CakePHP2.8でsaveAll後、保存しようとしていたデータそのものが変更されてしまう

urdapple

総合スコア83

CakePHP

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

0グッド

0クリップ

投稿2018/06/20 10:13

CakePHPのver2.8にて。

以下のようなデータを作成します。

php

1$this->request->data = 2[ 3 "ModelName" => 4 [ 5 0 => 6 [ 7 "foo_1" => "あああ", 8 "foo_2" => "いいい" 9 ], 10 1 => 11 [ 12 "foo_1" => "ううう", 13 "foo_2" => "えええ" 14 ], 15 ] 16]

そしてこのデータを保存します。

php

1$this->ModelName->create(); 2if($this->ModelName->saveAll($this->request->data["modelName"])) 3{ 4 $this->Flash->success("保存しました"); 5} 6else 7{ 8 $this->Flash->error("保存できませんでした"); 9}

saveAllが成功にせよ失敗にせよ、その後「$this->request->data」の中身を調べると

php

1$this->request->data = 2[ 3 "ModelName" => 4 [ 5 0 => 6 [ 7 "foo_1" => "あああ", 8 "foo_2" => "いいい" 9 ], 10 1 => 11 [ 12 "ModelName" => 13 [ 14 "foo_1" => "ううう", 15 "foo_2" => "えええ" 16 ] 17 ], 18 ] 19]

と、片方だけ1階層深くネストされちゃうんです。
成功したときは問題ないのですが、失敗したときは、この「$this->request->data」を持って再度Viewを描画するため、2つ目のデータが存在しないことになってしまい、Viewに再描画されません。

ちなみにどの段階でデータが書き換えられてしまうのか確かめるために、以下のように部分部分でdebugさせてみると、

php

1debug($this->request->data);// ...(1) 2 3$this->ModelName->create(); 4 5debug($this->request->data);// ...(2) 6 7if($this->ModelName->saveAll($this->request->data["modelName"])) 8{ 9 debug($this->request->data);// ...(3) 10 $this->Flash->success("保存しました"); 11} 12else 13{ 14 debug($this->request->data);// ...(4) 15 $this->Flash->error("保存できませんでした"); 16}

やはり、(3)と(4)の部分でデータが書き換わってしまっていました。
ちなみにsaveAllでまず動くのはバリデーションでしょうから、バリデーションのみを実行させてみました。

php

1debug($this->request->data);// ...(1) 2 3$this->ModelName->saveAll($this->request->data["ModelName"], ['validate' => 'only']);//saveAllのバリデーション機能のみを使用 4if($this->ModelName->validates()) 5{ 6 debug($this->request->data);// ...(2) 7} 8else 9{ 10 debug($this->request->data);// ...(3) 11 debug($this->ModelName->validationErrors); 12}

すると、やはり、実行後の(2)と(3)でデータが書き換わってしまっています。
単純にバリデーションしただけで、そのバリデーションしたデータそのものが書き換わってしまうことなんてありえるんでしょうか?
ちなみにバリデーションのルールが書いてあるモデルファイルのバリデーションルールは、念の為すべて殺してあります。

php

1class ModelName extends AppModel { 2public $validate = 3[ 4// 'foo_1' => 5// [ 6// 'notBlank' => 7// [ 8// 'rule' => ['notBlank'], 9// ], 10// ], 11// 'foo_2' => 12// [ 13// 'notBlank' => 14// [ 15// 'rule' => ['notBlank'], 16// ], 17// ], 18]; 19}

どなたか、取っ掛かりだけでもいいので、こういう事案にあったことある方いましたら、詳細教えてください!
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

自己解決

すいません。治りました。
でも原因不明のままです・・・

どうしても治らず、「$this->request->data」をforeachでループしながら個別に保存したらどうなるか実験。
問題なく保存され、かつ「$this->request->data」の中身書き換えも行われませんでした。
「もう、これでいいか」とも考えたんですが、個別保存だと内容不備により登録失敗したときにエラーの戻りが自動で制御されないので、Form部分にエラーの吐き出しが行われなかったです。
なので、やはりsaveAllでどうにかできないかともとに戻したら・・・

治ってました・・・
意味不明です・・・
新たにsaveAllを作り直したわけじゃなくて、コメントアウトしていたのを戻しただけです。
ホントに意味不明です_ノ乙(、ン、)_

お騒がせしましたm(_ _)m

投稿2018/06/21 03:27

urdapple

総合スコア83

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問