Php Laravel:如何在where子句中混合“and”和“and”或“or”条件?

Php Laravel:如何在where子句中混合“and”和“and”或“or”条件?,php,mysql,laravel,Php,Mysql,Laravel,我已经搜索并找到了类似的帖子,但没有一篇与我的案例相同。虽然我的案例在数据库查询的where子句中非常常见,但Laravel文档似乎没有显示像我这样的案例 在我的例子中,where子句如下所示,我无法让它与其他帖子中建议的where和where方法和技巧一起使用。任何信息谢谢。谢谢 where a = 1 and b = 2 and (c = 3 or c = 4) and (d = 5 or d = 6) 另一个复杂程度是,我可以将所有“and”条件组合到一个数组中,并将其输入到一个wher

我已经搜索并找到了类似的帖子,但没有一篇与我的案例相同。虽然我的案例在数据库查询的where子句中非常常见,但Laravel文档似乎没有显示像我这样的案例

在我的例子中,where子句如下所示,我无法让它与其他帖子中建议的where和where方法和技巧一起使用。任何信息谢谢。谢谢

where a = 1 and b = 2 and (c = 3 or c = 4) and (d = 5 or d = 6)
另一个复杂程度是,我可以将所有“and”条件组合到一个数组中,并将其输入到一个where方法中,但我必须将“or”条件分组到单独的数组中,并在代码中动态收集多少组,如下面所示

$and = [['a', '=', 1], ['b', '=', 2], ...];

if($cond1) $or['or1'] = [['c', '=', 3], ['c', '=', 4], ...];
if($cond2) $or['or2'] = [['d', '=', 5], ['d', '=', 6], ...];
if($cond3) $or['or3'] = [['e', '=', 7], ['e', '=', 8], ...];
...
PS:我要感谢所有回复帖子或评论的人。我认真考虑了所有的建议,并尝试了一些适用于我的案例的建议,但不幸的是,这些建议都不起作用。所以我的解决方案就是编译一个原始where子句,如我上面给出的示例所示,并使用WHERRAW方法。这件事做起来很简单,而且做得很好。

你可以这样做

Model::where('a', '1')
    ->where('b', '2')
    ->where(function ($q) {
         $q->where('c', '3')->orWhere('c', '4');
    })
    ->where(function ($q) {
         $q->where('d', '5')->orWhere('d', '5');
    })->get();
你可以这样做

Model::where('a', '1')
    ->where('b', '2')
    ->where(function ($q) {
         $q->where('c', '3')->orWhere('c', '4');
    })
    ->where(function ($q) {
         $q->where('d', '5')->orWhere('d', '5');
    })->get();

像这样的事情应该可以做到:

Model::where([
    ['a', '=', 1],
    ['b', '=', 2],
    [['c', '=', 3], 'OR', ['c', '=', 4]],
    [['d', '=', 5], 'OR', ['d', '=', 6]]
]);

像这样的事情应该可以做到:

Model::where([
    ['a', '=', 1],
    ['b', '=', 2],
    [['c', '=', 3], 'OR', ['c', '=', 4]],
    [['d', '=', 5], 'OR', ['d', '=', 6]]
]);

如果我有你的问题,那么这封信是给你的:

$result = DB::table('table')
   ->where('a', 1)
   ->where('b', 2)
   ->where(function($query) {
      $query->where('c', 3)
            ->orWhere('c', 4)
   })
   ->where(function($query) {
      $query->where('d', 5)
            ->orWhere('d', 6)
   ->get();

如果我有你的问题,那么这封信是给你的:

$result = DB::table('table')
   ->where('a', 1)
   ->where('b', 2)
   ->where(function($query) {
      $query->where('c', 3)
            ->orWhere('c', 4)
   })
   ->where(function($query) {
      $query->where('d', 5)
            ->orWhere('d', 6)
   ->get();
使用其中的子查询。我还没检查过,但我想这会有用的

Model::where('a', '1')
        ->where('b', '2')
        ->where(function ($q) {
             $q->whereIn('c', ['3', '4']);
        })
        ->where(function ($q) {
             $q->whereIn('d', ['5', '6']);
        })->get();
使用其中的子查询。我还没检查过,但我想这会有用的

Model::where('a', '1')
        ->where('b', '2')
        ->where(function ($q) {
             $q->whereIn('c', ['3', '4']);
        })
        ->where(function ($q) {
             $q->whereIn('d', ['5', '6']);
        })->get();

因为你改进了你的问题。以下是您如何实现它的方法

我还没有测试过。像这样的怎么样

$ands = [['a', '=', 1], ['b', '=', 2], ...];

$query = Model::query();
foreach($and as $and) {
    $query = $query->where($and);
}

if($cond1) $ors['c'] = [3, 4, ...];
if($cond2) $ors['d'] = [5, 6, ...];
if($cond3) $ors['e'] = [7, 8, ...];
...

foreach($ors as $key => $or) {
    $query = $query->where(function($q) use ($key, $or) {
        $q->whereIn($key,$or);
     });
}

$query->get();

因为你改进了你的问题。以下是您如何实现它的方法

我还没有测试过。像这样的怎么样

$ands = [['a', '=', 1], ['b', '=', 2], ...];

$query = Model::query();
foreach($and as $and) {
    $query = $query->where($and);
}

if($cond1) $ors['c'] = [3, 4, ...];
if($cond2) $ors['d'] = [5, 6, ...];
if($cond3) $ors['e'] = [7, 8, ...];
...

foreach($ors as $key => $or) {
    $query = $query->where(function($q) use ($key, $or) {
        $q->whereIn($key,$or);
     });
}

$query->get();

谢谢这将是最直接的解决方案,但不幸的是,它似乎不适合我。不确定它是否是更新版本的laravel中的功能。我的版本是5.7.19。谢谢。这将是最直接的解决方案,但不幸的是,它似乎不适合我。不确定它是否是更新版本的laravel中的功能。我的版本是5.7.19。谢谢。正如我在我的帖子中补充的,一组“或”条件的数量不是固定的,但这应该给我一个解决方案。谢谢。正如我在我的帖子中补充的,一组“或”条件的数量不是固定的,但这应该给我一个解决方案。谢谢。这应该给我一个变通解决方案,因为“或”条件组的数量不是固定的,谢谢。这应该给了我一个解决方案,因为“或”条件组的数量不是固定的,错误显示解析后的查询,如0=a和1==以及2=1和c中的c,=您现在可以检查它了吗。我带来了一些更改。错误显示解析后的查询,如0=a和1==以及2=1和c中的c,=您现在可以检查它了吗。我带来了一些变化。