1.はじめに
今回はファインダーとカスタムファインダーについて学習しました。
まず用語について、動画やcookbookを見て以下のように解釈しました。
[ファインダー]
テーブルのfindメソッドのことで、DBからデータをEntityとして取得するために使用する。
コントローラー内に記述する。
[カスタムファインダー]
テーブルにカスタムファインダーメソッドを定義し、コントローラーからfindメソッドで呼び出して使用する。よく利用するデータ取得の条件をカスタムファインダーメソッドとして定義することにより、メソッドチェーンで条件の掛け合わせができたり、クエリオブジェクトの再呼び出しが行えるので便利。
教材はチャンスラボ株式会社の公式YouTubeチャンネル。
https://www.youtube.com/@asterisk_cl_lab/videos
第14回の動画を参考にしました。
【CakePHP3 入門】第14回 ファインダーとカスタムファインダー
https://www.youtube.com/watch?v=Jy-U075SN0k
2.目次
1.はじめに
2.目次
3.ファインダーとカスタムファインダー
4.終わりに
3.【第14回 ファインダーとカスタムファインダー】
ソースコードを書き換えて、ファインダーの使用方法を解説しています。
1:47~1:57
ファインダーの戻り値はクエリーの実行結果ではなくクエリーオブジェクトであるとのこと。
つまりどういうことでしょうか?
色々ググって下記のように解釈しました。
- クエリーの実行結果=取得するデータ
- クエリーオブジェクト=SQL文と対応するオブジェクト
「ファインダーで直接データを取得しているのではなくSQL文を構成している」といった意味に取れますね。
動画内の例のようにカスタムファインダーをメソッドチェーンで記述した場合は、複数のSQL文でデータ取得の条件を定めているということになるのでしょうか?
1:58~2:20
find()で使用できるオプションに触れています。
cookbookによると複数オプションを指定することもできるようで、それによりSQLのようにデータ取得の条件を絞ったりできるようですね。
cookbook / データベースアクセス&ORM / データのロードにFinderを使う
https://book.cakephp.org/3/ja/orm/retrieving-data-and-resultsets.html#custom-find-methods
3:00~3:14
DebugKitのSQLlogを確認しています。
SQLlogを見るとファインダーで得たクエリオブジェクトがどのようなSQL文として実行されたのか結果を見ることができます。
便利な機能ですが、データを期待通りに扱えているのか確認するためにはSQLも押さえておかないといけませんね。
3:15~4:27
カスタムファインダーについて解説しています。
目的としては、「直近1ヵ月のデータを取得する」という操作をindexメソッドだけではなくviewメソッドなどでも使用するかもしれないので、操作内容をテーブルに記載してコントローラーのどのメソッドからも呼び出せるようにしましょう、ということですね。
カスタムファインダーを定義する場合はメソッド名をfindから始める必要があるとのことですが、これもCakePHPの規約ですね。今までフレームワークに触れたことが無かったので戸惑いましたが、今では規約に従った命名にも慣れてきました。
4:28~5:20
カスタムファインダーのメソッドチェーンについて実践しています。
条件の掛け合わせや使いまわしができて便利に感じますね。
ちなみに動画内の「直近1ヵ月」で「名前にマルオが含まれる」に該当するデータを参照した際のSQLlog画面は次の通りです。
SELECTやFROMの部分は重複せず、WHEREの部分は各条件がANDされています。
cookbookを読むと各条件をORとなるようにもできるようなので、色々な条件のSQL文を組み立てることができそうです。
4.終わりに
今回の学習で悩んだこと、感想など書き出したいと思います。
①find()ファインダーはクエリオブジェクトを生成するメソッド
カスタムファインダーで条件を使い回したり組み合わせることができるのは、ファインダーが都度SQL文を実行しているからではなく、SQL文と対応するオブジェクトを生成しているからです。最初、ファインダーは単にデータを参照しているのだとしか認識していませんでしたが、クエリオブジェクトを生成しているという点を強く意識するべきだと感じました。
②ORMについて
多くのオブジェクト指向言語にはORMという概念があり、CakePHPもその手法を使ってデータベースを操作しているようです。ORMはObjectRelationalMappingのことでオブジェクトとデータベースの対応を意味しており、今回学習したファインダーから生成されるクエリオブジェクトや、以前から扱っているEntity等のオブジェクトも、ORMの機能の一つと言っていいのではないでしょうか。
クエリオブジェクトってイマイチ理解できないなーと最初は思っていたのですが、ORMを先に知っていればもう少しスムーズに理解が進んだかもしれません。
そもそもCakePHPを学習する前に知っていれば、Entityに煩わされなくて済んだような、、、
逆にEntityで躓いたおかげでORMを調べたときに点と点が結ばれたような感覚になったのでしょうか。
動画内でも触れられていませんでしたが、おそらく「知ってて当然の知識」ということなのでしょう。もし僕の解釈に間違いがあれば是非正しい知識を教えてください!
余談
ORMについて調べているとPDO(PHP Data Objects)というものに遭遇しました。どうやらPDOもデータベースに関するものらしい、、、
寄道に寄道を重ね時間を掛けすぎているので、「PDOもある」ということだけ頭の片隅に留めておいて、必要な時が来たら調べ直すこととします。
以上、最後までご覧いただきありがとうございました。