CakePHPのselectが面倒くさいんじゃ!

追記
その後、こんなことしなくてももっと簡単にできることが判明。こちらのリンクを参照してください。

忘備録としてこのページも残しておきます。


CakePHPのQueryビルダーでカラムをselectするのはちょっと面倒です。パフォーマンス的には本当はよくないんだけど、select()メソッドを使わなければ全部のメソッドを引っ張ってこれますが、joinしたとか集計したとか何らかの理由でselect()メソッドを使わないといけない場合は、いちいち全部書かないと出力されないので超めんどくさくなります。

因みにselectAllExcept()というメソッドがあるのですが、指定したもの以外は全部selectするという感じのもので、出力を制限するのには使えますが、出力結果はアソシエーション元のモデル名が強制的に入るため、アソシエーションされたモデルに対しては使えません。テーブルオブジェクト渡す仕様だけど、強制的にアソシエーション元のモデル名が入るならいらなくないですかね?バグかな?

Queryビルダーじゃなかった頃は、アスタリスクを入れれば全部引っ張ってこれたりしたような気がしますが、Queryビルダーだとダメで、内部を追ってみると、selectがセットされてなかったら全部のカラムを出すみたいな感じな処理になってるように見えます。

というわけで、全部書かないとだめだけど、いちいち書くのめんどくさいよね。

CakePHP4

use Cake\Utility\Hash;

$this->Models->find()
->select(Hash::format($this->Models->getSchema()->columns(),["{n}"],"Models.%s"))

Modelsのところはモデル名になります。
Hash関数のフォーマットでclumm一覧を整形して渡す感じですね。
いちいち書くのは面倒だし、不要なカラムもわたってしまうので、関数化、ライブラリ化したほうがいいかもしれませんね。

CakePHPの配列をいじるライブラリのHashやCollectionはすごく便利なので覚えておくとよいです。

タイトルとURLをコピーしました