LoginSignup
0
0

More than 1 year has passed since last update.

laravelのクエリでMySQLの関数を使うとundefinedになる場合の解決方法

Last updated at Posted at 2022-06-06

動作環境

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と表示されている時点で、カラム名が未定義になってしまっていると気づけば、もっと早く解決したと思いました。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0