雑多なブログ

音楽や語学、プログラム関連の話題について書いています

Laravel - SoftDeletesを適用したモデルクラスでテーブル名のエイリアスが使えない

SoftDeletesを適用したモデルクラスでクエリーを実行すると、 カラムが存在しない、という内容のSQLエラーが発生する。

>>> \App\Models\Comment::from('comments', 'c')->where('c.id', '<>', 1)->get()

Illuminate\Database\QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'comments.deleted_at'in 'where clause' (SQL: select * from `comments` as `c` where `c`.`id` <> 1 and `comments`.`deleted_at` is null)'

SoftDeletes適用時、自動で「table_name.deleted_at」がwhere句に追加される。その際、from() メソッドでエイリアスを指定しても、それは無視される。

Laravel8.53.1時点でも本件修正されていないので、バグというより仕様だと考えた方が良さそうだ。
したがって、SoftDeletesを適用したモデルクラスでクエリーを組み立てる場合、テーブル名はエイリアスを使用せず、「テーブル名.カラム」の形式で対応するのが無難だと思う。