【问题标题】:Writing Eloquent version of query with Not Where condition使用 Not Where 条件编写 Eloquent 版本的查询
【发布时间】:2019-03-07 18:32:33
【问题描述】:

如何用 eloquent 编写这个查询?

SELECT * 
FROM  `table`
WHERE 
    !(
        ((col0 = 'AA') AND (col1 = 'AA'))
     OR
        ((col0 = 'BB') AND (col1 = 'BB'))
    )

这是我拥有的 Eloquent 版本:

        $query->where(function ($sub_query){
            $sub_query->orWhere(function ($sub_sub_query){
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
            });
            $sub_query->orWhere(function ($sub_sub_query){
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
            });
        });

我还没有找到可以做的事情!(XXX)

谢谢!

编辑:

我找到了解决办法:

https://laracasts.com/discuss/channels/eloquent/negate-entire-nested-where-clause

有代码:

        $query->where(function ($sub_query){
            $sub_query->orWhere(function ($sub_sub_query){
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
            });
            $sub_query->orWhere(function ($sub_sub_query){
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
            });
        }, null, null, 'AND NOT');

【问题讨论】:

  • 请发布您的解决方案作为答案。

标签: php mysql laravel eloquent


【解决方案1】:

我找到了解决方案:https://laracasts.com/discuss/channels/eloquent/negate-entire-nested-where-clause

有代码:

    $query->where(function ($sub_query){
        $sub_query->orWhere(function ($sub_sub_query){
            $sub_sub_query->where(function ($sub_sub_query){
                // Some stuff
            });
            $sub_sub_query->where(function ($sub_sub_query){
                // Some stuff
            });
        });
        $sub_query->orWhere(function ($sub_sub_query){
            $sub_sub_query->where(function ($sub_sub_query){
                // Some stuff
            });
            $sub_sub_query->where(function ($sub_sub_query){
                // Some stuff
            });
        });
    }, null, null, 'AND NOT');

【讨论】:

    【解决方案2】:
    WHERE
    !(
        ((col0 = 'AA') AND (col1 = 'AA'))
      OR
        ((col0 = 'BB') AND (col1 = 'BB'))
    )
    

    等价于

    WHERE
        !((col0 = 'AA') AND (col1 = 'AA')) 
      AND
        !((col0 = 'BB') AND (col1 = 'BB'))
    

    因为 NOT ( A OR B ) === NOT A AND NOT B

    更简单就变成了

    WHERE
        ( !(col0 = 'AA') OR !(col1 = 'AA') )  
      AND
        ( !(col0 = 'BB') OR !(col1 = 'BB') )
    

    因为 NOT A 和 B === NOT A OR NOT B

    所以查询可以这样构建..

    $q->where(function($q) {
        $q->where('col0','!=','AA')->orWhere('col1','!=','AA');
    })->where(function($q) {
        $q->where('col0','!=','BB')->orWhere('col1','!=','BB');
    });
    

    【讨论】:

      【解决方案3】:

      试试这个query更改Model为你的table model检查这个和test

      $object = Model::where([['col0' ,'<>', 'AA'],['col1','<>','AA']])
      ->orWhere([['col0','<>','BB'],['col1','<>', 'BB']])->get();
      

      【讨论】:

      • 我需要在括号前加上问号:WHERE !(# SOME STUFF #)
      • 你需要AA和BB的结果不同??
      【解决方案4】:

      你可以把你的查询变成这样:

      SELECT * 
      FROM  `table`
      WHERE 
          (
              ((col0 != 'AA') OR (col1 != 'AA'))
           AND
              ((col0 != 'BB') OR (col1 != 'BB'))
          )
      

      结果相同,可以这样表达:

          $query->where(function ($sub_query){
              $sub_query->Where(function ($sub_sub_query){
                  $sub_sub_query->where('col0' ,'!=', 'AA')
                                ->Orwhere('col1' ,'!=', 'AA');
              });
              $sub_query->Where(function ($sub_sub_query){
                  $sub_sub_query->where('col0' ,'!=', 'BB')
                                ->Orwhere('col1' ,'!=', 'BB');
              });
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-05
        • 2018-08-14
        • 1970-01-01
        • 2020-08-15
        • 2021-12-02
        • 2014-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多