Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 使用查询生成器或Eloquent与附加条件的联接_Laravel_Laravel 4_Laravel Query Builder - Fatal编程技术网

Laravel 使用查询生成器或Eloquent与附加条件的联接

Laravel 使用查询生成器或Eloquent与附加条件的联接,laravel,laravel-4,laravel-query-builder,Laravel,Laravel 4,Laravel Query Builder,我正在尝试使用带有Laravel查询生成器的联接查询添加一个条件 $results=DB::table('rooms')) ->不同的() ->leftJoin('bookings',函数($join) { $join->on('rooms.id'、'='、'bookings.rooms\u type\u id'); $join->on('arrival','>=',DB::raw('2012-05-01'); $join->on('arrival','=',DB::raw('2012-05-0

我正在尝试使用带有Laravel查询生成器的联接查询添加一个条件

$results=DB::table('rooms'))
->不同的()
->leftJoin('bookings',函数($join)
{
$join->on('rooms.id'、'='、'bookings.rooms\u type\u id');
$join->on('arrival','>=',DB::raw('2012-05-01');
$join->on('arrival','=',DB::raw('2012-05-01');

$join->on('execution',“原始查询和标准选择之间存在差异(在
DB::raw
DB::select
方法之间)

您可以使用
DB::select
做您想做的事情,只需插入
占位符,就像您对准备好的语句所做的那样(实际上就是它在做的事情)

一个小例子:

$results = DB::select('SELECT * FROM user WHERE username=?', ['jason']);

第二个参数是一个值数组,用于从左到右替换查询中的占位符。

如果您有一些参数,可以这样做

    $results = DB::table('rooms')
    ->distinct()
    ->leftJoin('bookings', function($join) use ($param1, $param2)
    {
        $join->on('rooms.id', '=', 'bookings.room_type_id');
        $join->on('arrival','=',DB::raw("'".$param1."'"));
        $join->on('arrival','=',DB::raw("'".$param2."'"));

    })
    ->where('bookings.room_type_id', '=', NULL)
    ->get();
然后返回您的查询


返回$results;

您可以复制左连接中的括号:

LEFT JOIN bookings  
               ON rooms.id = bookings.room_type_id
              AND (  bookings.arrival between ? and ?
                  OR bookings.departure between ? and ? )

随后,您必须使用“setBindings”设置绑定,如本文所述:


它并不漂亮,但很有效。

像这样的sql查询示例

LEFT JOIN bookings  
    ON rooms.id = bookings.room_type_id
    AND (bookings.arrival = ?
        OR bookings.departure = ?)
Laravel连接具有多种条件

->leftJoin('bookings', function($join) use ($param1, $param2) {
    $join->on('rooms.id', '=', 'bookings.room_type_id');
    $join->on(function($query) use ($param1, $param2) {
        $query->on('bookings.arrival', '=', $param1);
        $query->orOn('departure', '=',$param2);
    });
})

我使用的是laravel5.2,我们可以添加具有不同选项的连接,您可以根据需要进行修改

Option 1:    
    DB::table('users')
            ->join('contacts', function ($join) {
                $join->on('users.id', '=', 'contacts.user_id')->orOn(...);//you add more joins here
            })// and you add more joins here
        ->get();

Option 2:
    $users = DB::table('users')
        ->join('contacts', 'users.id', '=', 'contacts.user_id')
        ->join('orders', 'users.id', '=', 'orders.user_id')// you may add more joins
        ->select('users.*', 'contacts.phone', 'orders.price')
        ->get();

option 3:
    $users = DB::table('users')
        ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
        ->leftJoin('...', '...', '...', '...')// you may add more joins
        ->get();

我的五分钱用于方案在(…或…)和(…或…)和….上左连接

    ->join('checks','checks.id','check_id')
    ->leftJoin('schema_risks', function (JoinClause $join) use($order_type_id, $check_group_id,  $filial_id){
        $join->on(function($join){
            $join->on('schema_risks.check_method_id','=', 'check_id')
                ->orWhereNull('schema_risks.check_method_id')
                ;
        })
        ->on(function($join) use ($order_type_id) {
            $join->where('schema_risks.order_type_id', $order_type_id)
                ->orWhereNull('schema_risks.order_type_id')
                ;
        })
        ->on(function($join) use ($check_group_id) {
            $join->where('schema_risks.check_group_id', $check_group_id)
                ->orWhereNull('schema_risks.check_group_id')
                ;
        })
        ->on(function($join) use($filial_id){
            $join->whereNull('schema_risks.filial_id');
            if ($filial_id){
                $join->orWhere('schema_risks.filial_id', $filial_id);
            }
        })            
        ->on(function($join){
            $join->whereNull('schema_risks.check_risk_level_id')
                ->orWhere('schema_risks.check_risk_level_id', '>' , CheckRiskLevel::CRL_NORMALLLY );
        })
        ;
    })

感谢您的回答。不幸的是,生成的查询略有不同,因为连接条件现在有
和arrival>=?和arrival=?以及department。实际上,我注意到?没有添加到ON子句中。ON中的那些值没有参数化,也没有受到SQL注入的保护。我发布了一个解决方案。这没有回答原始问题,该问题的or子句在此响应中被忽略。完美的解决方案。请记住在使用值时使用DB::raw,否则Laravel(至少在5.6.29中)会添加反引号并“中断”目标。这是否意味着参数会自动转义(从SQL注入中保存)是的,它只是PDO准备语句的包装。有没有办法在左连接中的ON子句中使用该技术?请参阅我的问题。我尝试在左连接闭包中执行
$join->ON('winners.year','=',DB::select('?',array('2013'))
但没有起作用。这并不是雄辩的设计初衷。你不妨自己做一个DB::raw()程序
LEFT JOIN bookings  
    ON rooms.id = bookings.room_type_id
    AND (bookings.arrival = ?
        OR bookings.departure = ?)
->leftJoin('bookings', function($join) use ($param1, $param2) {
    $join->on('rooms.id', '=', 'bookings.room_type_id');
    $join->on(function($query) use ($param1, $param2) {
        $query->on('bookings.arrival', '=', $param1);
        $query->orOn('departure', '=',$param2);
    });
})
Option 1:    
    DB::table('users')
            ->join('contacts', function ($join) {
                $join->on('users.id', '=', 'contacts.user_id')->orOn(...);//you add more joins here
            })// and you add more joins here
        ->get();

Option 2:
    $users = DB::table('users')
        ->join('contacts', 'users.id', '=', 'contacts.user_id')
        ->join('orders', 'users.id', '=', 'orders.user_id')// you may add more joins
        ->select('users.*', 'contacts.phone', 'orders.price')
        ->get();

option 3:
    $users = DB::table('users')
        ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
        ->leftJoin('...', '...', '...', '...')// you may add more joins
        ->get();
    ->join('checks','checks.id','check_id')
    ->leftJoin('schema_risks', function (JoinClause $join) use($order_type_id, $check_group_id,  $filial_id){
        $join->on(function($join){
            $join->on('schema_risks.check_method_id','=', 'check_id')
                ->orWhereNull('schema_risks.check_method_id')
                ;
        })
        ->on(function($join) use ($order_type_id) {
            $join->where('schema_risks.order_type_id', $order_type_id)
                ->orWhereNull('schema_risks.order_type_id')
                ;
        })
        ->on(function($join) use ($check_group_id) {
            $join->where('schema_risks.check_group_id', $check_group_id)
                ->orWhereNull('schema_risks.check_group_id')
                ;
        })
        ->on(function($join) use($filial_id){
            $join->whereNull('schema_risks.filial_id');
            if ($filial_id){
                $join->orWhere('schema_risks.filial_id', $filial_id);
            }
        })            
        ->on(function($join){
            $join->whereNull('schema_risks.check_risk_level_id')
                ->orWhere('schema_risks.check_risk_level_id', '>' , CheckRiskLevel::CRL_NORMALLLY );
        })
        ;
    })