Laravel查询构建器使用以下两种条件之一进行连接

时间:2018-02-09 09:19:58

标签: sql laravel-5 inner-join laravel-query-builder

我有一个复杂的查询,我想使用查询生成器或Eloquent(首选),但我正在努力与内部联接。

内连接需要是2个条件中的任何一个,因此如果一个失败,则使用另一个。

这是我的原始查询

SELECT DISTINCT tableA.crmid, tableB.* 
FROM tableB
INNER JOIN tableA ON tableA.crmid = tableB.customaccountsid
INNER JOIN tableC ON (tableC.relcrmid = tableA.crmid OR tableC.crmid = tableA.crmid)
WHERE tableA.deleted = 0 AND tableC.relcrmid = 123 AND tableC.relation_id = 186

这是我尝试使用查询生成器,我知道问题所在。我加入tableC的地方。我不知道如何在那里使用我的病情

DB::table('tableB')
    ->join('tableA', 'tableA.crmid', '=', 'tableB.customaccountsid')
    ->join('tableC', function($join) {
        $join->on(DB::raw('(tableC.relcrmid = tableA.crmid OR tableC.crmid = tableA.crmid)'));
    })
    ->where('tableA.deleted', 0)
    ->where('tableC.relcrmid', 3727)
    ->where('tableC.relation_id', 186)
    ->select('tableA.crmid', 'tableB.*')

Ant当我输出为SQL

时,这是查询的输出
SELECT `tableA`.`crmid`, `tableB`.* 
FROM `tableB` 
INNER JOIN `tableA` ON `tableA`.`crmid` = `tableB`.`customaccountsid` 
INNER JOIN `tableC` ON `tableC`.`relcrmid` = (tableC.relcrmid = tableA.crmid OR tableC.crmid = tableA.crmid) 
WHERE `tableA`.`deleted` = ? AND `tableC`.`relcrmid` = ? AND `tableC`.`relation_id` = ?

1 个答案:

答案 0 :(得分:2)

试试这个:

->join('tableC', function ($join){
        $join->on(function($query){
          $query->on('tableC.relcrmid', '=', 'tableA.crmid')
                ->orOn('tableC.crmid', '=', 'tableA.crmid');
        });
  })

它在原始查询中返回:

INNER JOIN tableC ON (tableC.relcrmid = tableA.crmid OR tableC.crmid = tableA.crmid)