laravel - 使用查询生成器或 Eloquent 进行带有附加条件的 JOIN

标签 laravel laravel-4 laravel-query-builder

我正在尝试使用 Laravel 查询生成器使用 JOIN 查询添加条件。

<?php

$results = DB::select('
       SELECT DISTINCT 
          *
          FROM 
             rooms 
                LEFT JOIN bookings  
                   ON rooms.id = bookings.room_type_id
                  AND (  bookings.arrival between ? and ?
                      OR bookings.departure between ? and ? )
          WHERE
                bookings.room_type_id IS NULL
          LIMIT 20',
    array('2012-05-01', '2012-05-10', '2012-05-01', '2012-05-10')
);

我知道我可以使用Raw Expressions但这样就会出现SQL注入(inject)点。我已经使用查询生成器尝试了以下操作,但生成的查询(显然,查询结果)不是我想要的:

$results = DB::table('rooms')
    ->distinct()
    ->leftJoin('bookings', function ($join) {
        $join->on('rooms.id', '=', 'bookings.room_type_id');
    })
    ->whereBetween('arrival', array('2012-05-01', '2012-05-10'))
    ->whereBetween('departure', array('2012-05-01', '2012-05-10'))
    ->where('bookings.room_type_id', '=', null)
    ->get();

这是 Laravel 生成的查询:

select distinct * from `room_type_info`
    left join `bookings` 
on `room_type_info`.`id` = `bookings`.`room_type_id` 
where `arrival` between ? and ? 
    and `departure` between ? and ? 
    and `bookings`.`room_type_id` is null

如您所见,查询输出没有结构(尤其是在 JOIN 范围内)。是否可以在 JOIN 下添加附加条件?

如何使用 Laravel 的查询生成器构建相同的查询(如果可能)使用 Eloquent 更好,还是应该保留 DB::select?

最佳答案

$results = DB::table('rooms')
                     ->distinct()
                     ->leftJoin('bookings', function($join)
                         {
                             $join->on('rooms.id', '=', 'bookings.room_type_id');
                             $join->on('arrival','>=',DB::raw("'2012-05-01'"));
                             $join->on('arrival','<=',DB::raw("'2012-05-10'"));
                             $join->on('departure','>=',DB::raw("'2012-05-01'"));
                             $join->on('departure','<=',DB::raw("'2012-05-10'"));
                         })
                     ->where('bookings.room_type_id', '=', NULL)
                     ->get();

不太确定是否可以将 Between 子句添加到 Laravel 中的联接中。

注释:

  • DB::raw() 指示 Laravel 不要放回引号。
  • 通过将闭包传递给连接方法,您可以向其添加更多连接条件,on() 将添加 AND 条件和 orOn() 将添加 OR 条件。

关于laravel - 使用查询生成器或 Eloquent 进行带有附加条件的 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16848987/

相关文章:

arrays - Laravel 验证输入数组

laravel - PhpWord TemplateProcessor 克隆表行并在其中插入信息

laravel - 使用 Laravel 的 Elixir (Gulp) 编译 Zurb Foundation 6

Laravel Scope 通过数据透视值

php - 如何在 Laravel 5.5 中同时使用 GroupBy 和 OrderBy

Laravel 中的 MySQL 子查询,如何连接查询并将第二个查询的结果作为新列添加到第一个查询?

PHPUnit/Lumen 总是返回 404

Laravel Blade View 未显示对其所做的更改

apache - Laravel 向服务器发送 10 次重定向?

php - 查询生成器获取模态实例