CakePHP3のfind結果判定方法
$samples = $this->Samples->find('all');
上記の取得結果なしについて、CakePHP2まではempty($samples)
でtrue
(=空配列)なら結果なしと判定できてましたが、CakePHP3では正しく判定できません。
CakePHP3ではisEmpty()
を使用します。($samples->isEmpty()
でtrue
なら結果なし)
マジックメソッド/動的なFinderのfindBy*
を使った場合も同様です。
また、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);
実行結果
何が違うのか?
アプリケーションが「マジック」または 動的な Finder を使用している場合、 あなたはそれらの呼び出しを改造する必要があります。3.x では findAllBy* メソッドは 削除され、代わりに findBy* が常に Query オブジェクトを返します。 最初の結果を取得するには、 first() メソッドを使用する必要があります。Finder メソッドの変更
とあります。findAllBy*
で呼び出してもfindBy*
が使用されているんじゃないかな?また、今後はfindBy*
で記述しておくべきですね。