
今、業務で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
以上です=