CakePHP3のfind結果判定方法

$samples = $this->Samples->find('all');

上記の取得結果なしについて、CakePHP2まではempty($samples)true(=空配列)なら結果なしと判定できてましたが、CakePHP3では正しく判定できません。 CakePHP3ではisEmpty()を使用します。($samples->isEmpty()trueなら結果なし)

マジックメソッド/動的なFinderfindBy*を使った場合も同様です。
また、findBy()で結果取得後に結果を使用する場合はfirst();をコールする必要があります。

サンプルコード

$samples = $this->Samples->findById($id);
if (!$samples->isEmpty()) {
    $sample = $samples->first();
    $name = $sample['name'];
}

findBy*とfindAllBy*の違い

色々なサイトでfindBy*は結果を1行で返すと書いてありますが、CakePHP3.xでは間違いになります。
findBy*も条件一致したデータを全て返すため、findAllBy*と同じになります。
公式ドキュメントでも同じと記載されています。

サンプル

$findBy = $this->Samples->findByPostId(15);
$findAllBy = $this->Samples->findAllByPostId(15);

実行結果

findByとfindAllByの違い

何が違うのか?

アプリケーションが「マジック」または 動的な Finder を使用している場合、 あなたはそれらの呼び出しを改造する必要があります。3.x では findAllBy* メソッドは 削除され、代わりに findBy* が常に Query オブジェクトを返します。 最初の結果を取得するには、 first() メソッドを使用する必要があります。
Finder メソッドの変更

とあります。findAllBy*で呼び出してもfindBy*が使用されているんじゃないかな?また、今後はfindBy*で記述しておくべきですね。

このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

関連コンテンツ

スポンサードリンク

Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です