プログラム開発の情報や、雑記を投稿しているサイトです。

CakePHP4 | findメソッドの主要機能のまとめ

CakePHPを利用する場合には、クエリービルダーを利用する機会が多いと思います。

SQLを直接記述して実行することも可能ですが、可能な限り、クエリービルダーを利用する方が、メリットが多いです。

また、クエリーを組み立てることで、 union やサブクエリーを使った 高度なクエリーも簡単に作成しデータを取得することが可能です。

セキュリティー面でも、クエリービルダーの裏側では PDO プリペアードステートメント(prepared statement)を使うことで、 SQL インジェクション攻撃から守られるなど、高度の保護されています。

本記事では、CakePHP よく利用するクエリービルダーの詳細について解説しています。

全件を取得する

無条件に全件を取得するには、下記のように find を利用します。

また、all()、toList()を利用することで、クエリーを直接実行することができます。

条件を指定する

条件項目が1つの場合には、下記のようになります。

複数の検索条件を指定するには、下記のようになります。

IN句を指定する

IS NULLを指定する

または、下記の指定でも取得可能です。

先頭行を取得する

カラムから値リストを取得する

カラムから値リストを取得するには、Collection ライブラリーの extract() メソッドを利用します。

クエリーの結果から、key-value リストを生成することも可能です。

combine を利用して、リストを生成することも可能です。

select項目を変更する

連想配列を利用することで、フィールドのエイリアス(別名)をセットすることが可能です。

select distinct するためには、distinct() メソッドを利用することができます。

select($fields) を呼んだ後に、テーブルのすべてのフィールドを選択するには、 下記の方法でテーブルインスタンスを select() に渡すことができます。
この例では、first_nameとlast_nameを連結したfull_name と usersテーブルのすべての項目を取得しています。

条件に無名関数を指定する

ソート条件を指定する

複合的な式のソート条件を指定する

複数の項目を連結した複合的な式でソートをするには、order 以外に、 orderAscとorderDescメソッドを利用することができます。

SQL関数を利用する

SQL関数には、多くのおなじみの関数が func() メソッドとともに作成することができます。

SQL関数一覧

関数 説明
rand 0から1の間の乱数をSQLで生成します。
sum 合計を算出します。 引数はリテラル値として扱われます。
avg 平均値を算出します。 引数はリテラル値として扱われます。
min カラムの最小値を算出します。 引数はリテラル値として扱われます。
max カラムの最大値を算出します。 引数はリテラル値として扱われます。
count 件数を算出します。 引数はリテラル値として扱われます。
concat 2つの値を結合します。 引数はバインドパラメーターとして扱われます。
coalesc Coalesc を算出します。 引数はバインドパラメーターとして扱われます。
dateDiff 2つの日にち/時間の差を取得します。 引数はバインドパラメーターとして扱われます。
now デフォルトでは日付と時刻を返しますが、 'time' または 'date' を指定してこれらの値のみを返すこともできます。
extract SQL 式から特定の日付部分(年など)を返します。
dateAdd 日付式に単位時間を加算します。
dayOfWeek SQL の WEEKDAY 関数を呼ぶ FunctionExpression を返します。

集約 - Grouping と Having

count や sum などの集約関数を利用するするには、 下記の集約メソッドを利用することができます。
以下は、登録日が同一のユーザー数が10人以上のデータを取得しています。

Case文

成績表ごとの得点を確認したいクエリーは、下記のようになります。

レコードの合計数を取得する

Query オブジェクトを使って、条件の結果見つかった行の合計数を取得することができます。

関連付くデータを取得する

Query オブジェクトを使って、条件の結果見つかった行の合計数を取得することができます。

また、下記のように、深い関連データをイーガーロードすることができます。

関連を含んだソートの指定

joinを追加する

複数 join の連想配列を渡すことで、複数の join を一度に追加できます。

クエリー補足

クエリーの遅延評価

CakePHPのクエリーの実行タイミングを理解しておくことは非常に重要です。
Cookbookには、下記の説明があり、一読されることをおススメいたします。

Query オブジェクトは遅延評価されます。 これはクエリーが次のいずれかが起こるまで実行されないということを意味します。
クエリーが foreach() でイテレートされる。
クエリーの execute() メソッドが呼ばれる。これは下層の statement オブジェクトを返し、 insert/update/delete クエリーで使うことができます。
クエリーの first() メソッドが呼ばれる。 SELECT (それがクエリーに LIMIT 1 を加えます) で構築された結果セットの最初の結果が返ります。
クエリーの all() メソッドが呼ばれる。結果セットが返り、 SELECT ステートメントでのみ使うことができます。
クエリーの toList() や toArray() メソッドが呼ばれる。
このような条件が合致するまでは、 SQL をデータベースへ送らずに、クエリーを変更することができます。 つまり、 Query が評価されないかぎり、SQL はデータベースへ送信されないのです。 クエリーが実行された後に、クエリーを変更・再評価したら、追加で SQL が走ることになります。

Cookbook:クエリーの遅延評価

Cookbook

クエリーオブジェクト

Cookbook:https://book.cakephp.org/4/ja/orm/query-builder.html#id2

まとめ

いかがだったでしょうか?

CakePHPのクエリービルダーには、非常に便利な機能がたくさんあります。

利用する機会が少ないものもありますが、

知っておくだけでも、コードがスッキリする場合があります。

詳細まで把握しておく必要はないと思いますが、

こんな機能があるのだという程度でもよいので、

あたまのスミに置いておくと良いと思います。

また、CakePHPの公式サイトの Cookbookは非常に良くまとまっているサイトです。

ぜひ、熟読されることをおススメいたします。

おススメ書籍

中山清喬 (著), 飯田理恵子 (著), 株式会社フレアリンク (監修)


国本大悟 (著), 須藤秋良 (著), 株式会社フレアリンク (監修)