Cakephp PHP WEB開発

【Cakephp4】クエリビルダーのセレクト別名指定の注意点

※本サイトはPR表記を含みます。

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' => 'ほげ',
    ],
],

-Cakephp, PHP, WEB開発
-