Laravel 5:使用IN查询加入

时间:2015-07-09 23:34:41

标签: sql laravel

我尝试做类似的事情:

$results = $query->leftJoin('checklist_items', function($join) use ($days) {
    $join->on('users.id', '=', 'checklist_items.user_id')
        ->on('checklist_items.due_date', 'IN', $days);
})
    ->where('checklist_items.user_id', null)
    ->limit(10)
    ->get();

这是我尝试执行的查询示例:

SELECT * 
FROM users 
LEFT JOIN checklist_items 
ON users.id = checklist_items.user_id 
AND checklist_items.due_date IN ('2015-07-09', '2015-07-10') 
WHERE checklist_items.user_id IS NULL
ORDER BY users.id

所以这是一个左外连接。在查询构建器中,大部分都没有问题。问题是我的AND行使用IN查询。如果它是WHERE子句的一部分,我会使用 - > whereIn但是因为我在Join子句中需要它,所以在其中没有工作且没有orIn或其他一些。

建议?

4 个答案:

答案 0 :(得分:2)

我认为您需要使用DB::raw(),因此它不会尝试引用您的日期并将您的日期包括在括号中。这应该可以解决问题。

$days = '(\'2015-07-09\', \'2015-07-10\')';
$results = DB::table('users')->leftJoin('checklist_items', function($join) use ($days) {
    $join->on('users.id', '=', 'checklist_items.user_id')
        ->on('checklist_items.due_date', 'IN', DB::raw($days));
})
->where('checklist_items.user_id', null)
->limit(10)
->toSql();

echo $results;

答案 1 :(得分:2)

此查询将有效

$results = DB::table('users')
    ->join('checklist_items','checklist_items.user_id','=','users.id')
    ->whereIn('checklist_items.due_date',['2015-07-09', '2015-07-10'])
    ->whereNull('checklist_items.user_id')
    ->orderBy('users.id','asc')

答案 2 :(得分:1)

您可以在->whereIn()闭包内使用->leftJoin()(在Laravel 5.7.16中测试):

$days = ['2015-07-09', '2015-07-10'];
$results = \DB::table('users')
    ->leftJoin('checklist_items', function($join) use ($days) {
        $join->on('users.id', '=', 'checklist_items.user_id')
            ->whereIn('checklist_items.due_date', $days);
    })
    ->where('checklist_items.user_id', null)
    ->orderby('users.id')
    ->get();

dd(\DB::getQueryLog();的输出产生您的示例查询:

array:1 [▼
  0 => array:3 [▼
    "query" => "select * from `users` left join `checklist_items` on `users`.`id` = `checklist_items`.`user_id` and `checklist_items`.`due_date` in (?, ?) where `checklist_items`.`user_id` is null order by `users`.`id` asc ◀"
    "bindings" => array:2 [▼
      0 => "2015-07-09"
      1 => "2015-07-10"
    ]
    "time" => 6.97
  ]
]

答案 3 :(得分:0)

对于 Laravel 7 及以上版本,使用 whereIn 而不是 on :

 $join->on('users.id', '=', 'checklist_items.user_id')
    ->whereIn('checklist_items.due_date',$days);