Cakephp プログラミング

【Cakephp】Cake2のfieldsでのカラム指定(*)をCake3以降での指定方法

 

今、業務でCake2 → Cake3/4 へ大幅アップデートを行うプロジェクトに参画中です。

 

Cake2は既にサポートが今年の6/15で終了し、急ピッチで行わなければなりません。

https://qiita.com/bezeklik/items/72d1ff8393f66673e2bc#cakephp

 

単に、Cakeアップデートといっても、ポチったり、hogefuga --update とか打ったりして、はい、終了~で終われば最&高ですが、そうはいきません。

特にCake2から3は多くの破壊的変更があり、移行といっても、「ゼロから作り直す」と言っても過言ではない程、変更されています。(やりすぎ)

 

移行するにあたっては、エンジニアの趣味思考によって、Laravelであったり、モダンなツールを導入してみちゃり、色々案はあると思います。

重要なのは、作り方がモダンかどうかではなく、組織内で従来使用してきたフレームワークに対して蓄積されたノウハウやハウツーを活かすことの方が大事だと僕自身はそう思います。

 

モダンツールを追っかける(不要とは言ってないデス。それも大事だと。)と、組織の財産(ノウハウ)をある意味捨てることになってしまうので、勿体無い。

そして、Cakephpも開発(サポート)は続けられているので、今後も頑張って欲しいと思います。

 

今回はCake2からCake3以降アップデート作業の中で、忘備録として残します。

 

Cake2のfieldsでのカラム指定(*)をCake3以降では使えなくなった

Cake2では、DBデータを取得する際にカラム指定で多用することになるfields* (アスタリスク)を指定できていたのですが、Cake3以降ではそれができましぇん。

Cake2

 code
$this->Hoge->find('first', [
    'fields' => ['Hoge.*', 'Fuga.name'], // Hoge.*(アスタリスク) ← コレ
    'contain' =>['Fuga'],
]);

Cake3以降ではアスタリスクを使えなくなったので、下記の様に指定します。

■ Cake3 / Cake4

 code
$this->Hoges->find()
    ->select($this)
    ->select(['Fugas.name'])
    ->contain(['Fugas'])
    ->first();

上記コードはテキトーな例なのであしからず。

 

Cake3以降でのカラム指定は、それまでfields部分だった箇所はselectに変更になっています。

そして、自身のモデルの全てを指定する場合、$thisを指定することができます。

contain部分で指定したカラムがある場合、さらにselect指定を続けて記述すれば良さそうです。

 

containのモデルを全て指定したい場合は、逆に何もselectで指定しなくとも、紐づいて全て取得されるはずなので、問題ありませんね。

 

追記

■ クエリビルダ内にselect()を使用している場合

作業してて気づいたんですが、例えば、クエリビルダにselect()を指定し、各フィールドを選んでいる場合でcontain内モデルの全取得を完結にしたい時ってありますよね?

そんな場合は enableAutoFields(true) を使用しましょう。(違うやり方もありますが・・)

 

 code
$query->select(['id', 'title'])
    ->contain(['Comments', 'Tags'])
    ->enableAutoFields(true); // containのモデルを全部取得してくれる
}]);

 

Cake3ドキュメント

https://book.cakephp.org/3/ja/orm/query-builder.html#contain

 

以上です=

 

-Cakephp, プログラミング
-

© 2021 FuwaFuwaShoChan BLOG