LaravelのEloquentの機能だけでは実現できないSQLクエリを書きたい場合に、サブクエリを使ったりすると思います。
$sub = Hoge::select(['fuga_id', 'piyo'])
->複雑なフィルター();
$subRaw = Str::replaceArray('?', $sub->getBindings(), $sub->toSql());
DB::from("foo, ({$subRaw}) as hoge")
->where('foo.fuga_id', 'hoge.fuga_id')
->update(['foo.bar' => 3]);
そんなとき、以下のような謎のエラーに遭遇することがあります。
Invalid datetime format: 1292 Truncated incorrect DECIMAL value: 'hoge.fuga_id'
これは where() の2個目の引数にテーブル名カラム名を文字列として使っているのが原因です。Laravelのクエリビルダーは2個目の引数をそのまま値として(’hoge.fuga_id’ という文字列として) foo.fuga_id
と比較しようとするので、型が違うので怒られているという感じです。
直すには以下のように DB::raw()
を使います。
DB::from("foo, ({$subRaw}) as hoge")
->where('foo.fuga_id', DB::raw('hoge.fuga_id'))
->update(['foo.bar' => 3]);