Eloquent在高级连接中进行了提升

时间:2014-09-13 17:50:36

标签: sql laravel-4 eloquent

我正在尝试进行以下加入:

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
        )

1 个答案:

答案 0 :(得分:3)

不幸的是JoinClause s where不像普通的where子句那样工作,并且你不能为嵌套的wheres传递闭包,所以你只需重复部分条件。

此外,您的其他加入条款不需要whereDB::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');