CakephpにてSQLビルダーの組み立て中に、エイリアスを利用してSQL関数を実行させようとしていました。
が、なぜか実行されず、「うーん。なんで?」と考えることに。
結論からいうと、「エイリアスを実カラム名と同じ名前にすると、実カラム名の値で上書きされる」ということでした。優先度が高いのが実カラム名という意味でもあるのかも?
以下、簡単な例を示します。
SQLビルダにてエイリアスを利用してSQL関数を実行
$query->select([ // エイリアスと実カラムを同じ名前にすると実カラムデータが優先されてしまう 'name' => 'CONCAT(myouji, name)', ]);
上記のような場合で実行結果を見ると、単にnameカラムのみになってしまいます。(CONCAT
は実行されない)
なので、単にエイリアスを実フィールド名にしなければよい話なのですが、実フィールド名を守る必要がある場合は一時的なエイリアス名で取得しつつ、取得後に実フィールド名要素の配列なりオブジェクトなりを生成し、そちらにデータを放り込めばよいと思います。
エイリアスを利用する場合、一時的にでもユニークな名前にする
$query->select([ // エイリアスと実カラムを違う名前にしておくことで名前衝突を避ける 'tmp_name' => 'CONCAT(myouji, name)', ]); // 実フィールド名に準拠したい場合、シンプルに入れ替えばよい $data = $query->toArray(); $data['name'] = $data['tmp_name']; $this->set('data', $data);
実フィールド名とエイリアス名を別々の名前にすることで SQL関数を実行することが可能です。ちょっとした罠にひっかかりやすいので気をつけましょう。