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

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

ただいまの
回答率

90.32%

  • CakePHP

    2391questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 123

urdapple

score 57

CakePHPのver2.8にて。

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

$this->request->data =
[
    "ModelName" =>
    [
        0 =>
        [
            "foo_1" => "あああ",
            "foo_2" => "いいい"
        ],
        1 =>
        [
            "foo_1" => "ううう",
            "foo_2" => "えええ"
        ],
    ]
]

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

$this->ModelName->create();
if($this->ModelName->saveAll($this->request->data["modelName"]))
{
    $this->Flash->success("保存しました");
}
else
{
    $this->Flash->error("保存できませんでした");
}

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

$this->request->data =
[
    "ModelName" =>
    [
        0 =>
        [
            "foo_1" => "あああ",
            "foo_2" => "いいい"
        ],
        1 =>
        [
            "ModelName" =>
            [
                "foo_1" => "ううう",
                "foo_2" => "えええ"
            ]
        ],
    ]
]

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

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

debug($this->request->data);// ...(1)

$this->ModelName->create();

debug($this->request->data);// ...(2)

if($this->ModelName->saveAll($this->request->data["modelName"]))
{
    debug($this->request->data);// ...(3)
    $this->Flash->success("保存しました");
}
else
{
    debug($this->request->data);// ...(4)
    $this->Flash->error("保存できませんでした");
}

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

debug($this->request->data);// ...(1)

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

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

class ModelName extends AppModel {
public $validate =
[
//    'foo_1' =>
//    [
//        'notBlank' =>
//        [
//            'rule' => ['notBlank'],
//        ],
//    ],
//    'foo_2' =>
//    [
//        'notBlank' =>
//        [
//            'rule' => ['notBlank'],
//        ],
//    ],
];
}

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • CakePHP

    2391questions

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