読者です 読者をやめる 読者になる 読者になる

ITの隊長のブログ

ITの隊長のブログです。いや、まだ隊長と呼べるほどには至っていないけど、日々がんばります。CakePHPとPlayFrameworkを使って仕事しています。最近はAngular2をさわりはじめたお(^ω^ = ^ω^)

【CakePHP】摩訶不思議CakePHP。save()とsaveAll()の返り値

CakePHP PHP

スポンサードリンク

はまりましたよー(^q^)ダウー

返り値が摩訶不思議アドベンチャーでした。

さて、最近アソシエーションをよく使うようになりました。変ったことといえば、データを保存するときのメソッドsave()からsaveAll()に変ったぐらい。

で、ハマった点というのはsaveAll()の返り値だ。

save()の返り値はいくつかあるが、保存に成功したときは保存したデータを返してくれる。この認識が落とし穴だった。

同様にsaveAll()を使ってみて、booleanしか返らずあせる。

ドキュメントをみても書いていない(多分)。やばいと思いつつソースを確認してみた。

ソースを読む(コメントだけ)

  • save()
 * @return mixed On success Model::$data if its not empty or true, false on failure

保存に成功したら、Model::$dataが返ってきますよ。で、返り値が空っぽ(empty)か、booleantrueだったら失敗していますよ。

・・・・(°ω°?(trueなのに失敗とはこれ如何に)

なるほど、そこにfalseはなかったというわけですな。今まで書いた条件分岐はヤバイということに気づきました。。。orz

  • saveAll()
 * @return mixed If atomic: True on success, or false on failure.
 *    Otherwise: array similar to the $data array passed, but values are set to true/false
 *    depending on whether each record saved successfully.

単純ですね。成功したらtrue、失敗したらfalseです。(下は訳せない。。。)

なるほど

なるほどーーーーーーーーーーーーーーーーーーーーーーーーーー!

どうして、同じクラスの中にこんなにも似て違う処理が存在するのかぁ!!!!!

俺には全くわかりませんです!(´;ω;`)ブワッ

ということでまとめ

  • save()は失敗してもtrueが返ってくる場合があるのでboolで判断するif文は使っちゃだめ

返り値が配列であればおkじゃないでしょうかね。こうしましょう

<?php
$postData = $this->request->data;
$data = $this->Model->save($postData);
if (is_array($data)) {
    // 保存に成功
} else {
    // 保存に失敗
}
  • saveAll()は単純にboolで返ってくるので、通常のif文でおk

うむ。。。開発思想がわからん。。。。とりあえずtrueはやっぱりおかしくない?