我正在尝试进行以下加入:
Schedules::select()
->leftJoin('histories', function ($j)
{
$j->on('histories.schedule_id', '=', 'schedules.id')
->where('histories.test', '=', DB::raw('schedules.test'))
->where(function ($q)
{
$q->where('histories.order_id', '=', 'schedules.order_id')
->orWhere('histories.customer_id', '=', DB::raw('schedules.customer_id'));
});
});
当我这样做时,Laravel会报告错误:
Missing argument 2 for Illuminate\Database\Query\JoinClause::where()
如何在Eloquent语法中构造此查询,以便获得与join语句相同的以下内容?
left join histories
on histories.schedule_id = schedules.id
and histories.test = schedules.test
and (
histories.order_id = schedules.order_id
or histories.customer_id = schedules.customer_id
)
答案 0 :(得分:3)
不幸的是JoinClause
s where
不像普通的where
子句那样工作,并且你不能为嵌套的wheres传递闭包,所以你只需重复部分条件。
此外,您的其他加入条款不需要where
和DB::raw
,而是再次使用on
。
所以基本上你需要这个:
$j->on('histories.schedule_id', '=', 'schedules.id')
->on('histories.test', '=', 'schedules.test')
->on('histories.order_id', '=', 'schedules.order_id')
->orOn('histories.schedule_id', '=', 'schedules.id')
->on('histories.test', '=', 'schedules.test')
->on('histories.customer_id', '=', 'schedules.customer_id');