動作環境
Laravel 6.20
php 8.0
MySQL 8.0.29
具体的な症状
- laravelでMySQLのクエリを使ってデータを取得したい。
- このとき、クエリ文の中でMySQLの関数(CONCATやIFNULLなどの関数)を利用したいが、これらの関数を利用すると、undefinedになってしまう。
- 具体的には、nullの場合に0に変えたいのだが、ifnull関数をクエリに追加するとundefinedになってしまう。なんとかしたい。(MySQLクライアントのworkbenchから同じクエリ文を実行すると、nullが0になって期待通りの表示がされるので、クエリ文自体は問題ない。そのため、laravelのコードの書き方に関して、何か別のルールがあると考えられる。)
参考ページ
- 以下のページがヒットして参考にしましたが、結局解決しませんでした。
- 試行錯誤の結果、正解を導き出せました。別の原因でした。
クエリビルダを利用した場合の例
undefinedになるコード
- 他の解説サイトでは、以下のようなコードでうまくいくように書かれていましたが、自分はundefinedになって、うまくいきませんでした。
- ifnullなどのMySQLの関数を追加すると、undefinedになってしまいます。
$query = DB::table('users');
$query->select('id');
$query->selectRaw('ifnull(users.name, 'no name')');
$users = $query->get();
正しく表示されるコード
$query = DB::table('users');
$query->select('id');
$query->selectRaw('ifnull(users.name, 'no name') as name');
$users = $query->get();
-
as name
を付けるだけで解決しました。- 他のサイトで書いているような、バック・クォーテーションで囲む必要はありませんでした。
SQL文を直書きする場合
undefinedになるコード
$sql = <<< SQL
select id, ifnull(name, 'no name') from users;
SQL;
$users = DB::select($sql);
正しく表示されるコード
$sql = <<< SQL
select id, ifnull(name, 'no name') as name from users;
SQL;
$users = DB::select($sql);
- やはり、
as name
を付けると正しく表示されました。
まとめ
- undefinedと表示されている時点で、カラム名が未定義になってしまっていると気づけば、もっと早く解決したと思いました。