首页 > 解决方案 > 如何设置双级深度或 where 子句

问题描述

我的查询目前是这样的:

    $erwachsene = $search_data['erwachsene'];
            $kinder = $search_data['kinder'];
            $rooms = Room::select('rooms.*')
            ->where('hotel_id', '=', $id)
            ->where('room_status', '=', 1)
            ->where(function($query) use ($erwachsene, $kinder) {
                $query->where("occupancy_adults1", ">=", $erwachsene);
                $query->where("occupancy_childs1", ">=", $kinder);
            })
            ->orWhere(function($query) use ($erwachsene, $kinder) {
                $query->where("occupancy_adults2", ">=", $erwachsene);
                $query->where("occupancy_childs2", ">=", $kinder);  
            })
            ->get();

这个返回查询是这样的:

    SELECT `rooms`.* 
    FROM   `rooms` 
    WHERE  `hotel_id` = ? 
    AND `room_status` = ? 
    AND ( `occupancy_adults1` >= ? 
    AND `occupancy_childs1` >= ? ) 
    OR ( `occupancy_adults2` >= ? 
    AND `occupancy_childs2` >= ? ) 

我需要将最后一个 AND 和 OR 子句放在 OR 组下:

SELECT `rooms`.* 
    FROM   `rooms` 
    WHERE  `hotel_id` = ? 
    AND `room_status` = ? 
    AND 
    (
          ( `occupancy_adults1` >= ? AND `occupancy_childs1` >= ? ) 
       OR ( `occupancy_adults2` >= ? AND `occupancy_childs2` >= ? ) 
    )

例如,多一级括号。Eloquent功能可以吗?

标签: laravel

解决方案


您必须级联您的 where 调用以获得预期的 SQL:

// ...
->where(function($query) use ($erwachsene, $kinder) {           // (
    $query->where(function($query) use ($erwachsene, $kinder) { //  (
        $query->where("occupancy_adults1", ">=", $erwachsene);  //    `occupancy_adults1` >= ?
        $query->where("occupancy_childs1", ">=", $kinder);      //   AND `occupancy_childs1` >= ?
    })->orWhere(function($query) use ($erwachsene, $kinder) {   //  ) OR (
        $query->where("occupancy_adults2", ">=", $erwachsene);  //   `occupancy_adults2` >= ?
        $query->where("occupancy_childs2", ">=", $kinder);      //   AND  `occupancy_childs2` >= ?
    });                                                         //  )
});                                                             // )

第一个 where 级别将创建外部括号,第二个 where 级别将创建 OR,第三个将创建内部 AND。


推荐阅读