Cakephp4のクエリビルダーの select()
は SQL の SELECT 文に相当します。クエリビルダーで、別名(AS)を利用する際に気をつけておきたい事柄です。
例: Cake2とCake4ではモデルの命名規則はCake2が単数形、Cake4が複数形のケース
Cake4にて クエリビルダーの $query->select()
を利用する場合、複数系のテーブルモデルを単数形にしたい場合を考えます。
通常、セレクトを指定する場合「テーブル名.カラム名」のドット区切りで指定します。
// 複数モデルがある場合は特に「テーブル名.カラム名」のドット区切りで指定する $query->select(['Hoges.name']);
が、別名を指定する場合、その指定方法だと、PDOException が発生します。
// 別名を利用する場合、同じようにドット区切りで指定するとPDOExceptionの例外エラーとなる $query->select(['Hoge.name' => 'Hoges.name']);
正しい指定の仕方は「テーブル名__カラム名」とすることで別名指定できるようになります。
// 別名を指定したい場合「テーブル名__カラム名」という形で指定する $query->select(['Hoge__name' => 'Hoges.name']);
余談: アソシエーションを張った状態だと、アソシエーション先と同階層配列としてフェッチできる
アソシエーションを貼った状態で「テーブル名__カラム名」の別名を利用することで、アソシエーション元と同じ配列階層でフェッチすることができます。
■ アソシエーションの設定なしの場合
// アソシエーションなしの場合の配列構造 0 => [ 'key' => [ 'id' => 1, 'name' => 'ほげ', '子key' => [ 'id' => 1, ], ], ],
■ アソシエーションの設定ありの場合
// アソシエーションあり。配列構造は同じ階層に 0 => [ '子key' => [ 'id' => 1, ], 'key' => [ 'id' => 1, 'name' => 'ほげ', ], ],