【CakePHP3】アソシエーションで3層以上のデータを同時に取得する方法




データベースを操作する上でアソシエーションはとても便利ですが、3層以上のデータをまとめて取得する方法を知らずに苦労していました。ついに解決法が見つかりましたので、メモとして残しておきたいと思います。

2層のデータを取得する場合

例えば、ブログ記事を保存するテーブルArticlesと、ユーザ名の管理をするテーブルusersが以下のようにあるとします。

Articlesテーブル

iduser_idcontents
10今日は公園に…
….….….

Usersテーブル

iduser_name
0太郎
1花子

 

このようにArticlesテーブルはUsersテーブルに対してbelongsToのテーブルを持っています。このとき、下記のコードによってまとめてデータを引き出すことが出来ます。

今回のトピックで重要なのは「contain(‘Users’)」の部分です。このメソッドを使うことにより、Articlesテーブルのデータだけではなく、レコードに紐付いたUsersデータも取得することが出来ます。この場合は以下のようなデータを取得できます。

3層以上をデータ取得する場合

結論から言えば、3つのテーブルA・B・Cがあったとして以下のコードで実装できます。findに対する引数で指定します。

find()の後にcontain()をつなげることによって2層は取得できたので、そのままリストにしようと思いましたがエラーが出ました。この場合だと、AとCがアソシエーション定義されていないよ、というエラーが出てしまいます。

そのため、find()を使ってしているすることで、Aのレコードに紐付いたBのレコードの紐付いたCのレコードをすべてまとめて引き出すことが出来ます。お試しを!