Laravel 4使用ORERE和OR进行Eloquent查询?

Far*_*her 254 php laravel eloquent laravel-query-builder

我怎么说 WHERE (a = 1 OR b =1 ) AND (c = 1 OR d = 1)

对于更复杂的查询,我应该使用原始SQL吗?

rmo*_*bis 416

使用参数分组(Laravel 4.2).对于你的例子,它是这样的:

Model::where(function ($query) {
    $query->where('a', '=', 1)
          ->orWhere('b', '=', 1);
})->where(function ($query) {
    $query->where('c', '=', 1)
          ->orWhere('d', '=', 1);
});
Run Code Online (Sandbox Code Playgroud)

  • 只需执行`function($ query)use($ param1,$ param2)...`; 哦,你删除了你的评论. (13认同)
  • 与Laravel doco的正确链接是:http://laravel.com/docs/queries#advanced-where-clauses (5认同)

Yil*_*kan 89

如果要在Laravel 4中使用a,b,c,d的参数

Model::where(function ($query) use ($a,$b) {
    $query->where('a', '=', $a)
          ->orWhere('b', '=', $b);
})
->where(function ($query) use ($c,$d) {
    $query->where('c', '=', $c)
          ->orWhere('d', '=', $d);
});
Run Code Online (Sandbox Code Playgroud)


Sam*_*bas 18

如果你想在laravel 4中使用括号并且不要忘记返回
在Laravel 4中(至少)你需要在括号中使用$ a,$ b,如例子中所示

$a = 1;
$b = 1;
$c = 1;
$d = 1;
Model::where(function ($query) use ($a, $b) {
    return $query->where('a', '=', $a)
          ->orWhere('b', '=', $b);
})->where(function ($query) use ($c, $d) {
    return $query->where('c', '=', $c)
          ->orWhere('d', '=', $d);
});
Run Code Online (Sandbox Code Playgroud)

这是我的结果: 在此输入图像描述


Sab*_*ett 14

如果你正在循环OR条件,你不需要第二个$ query->来自其他帖子(实际上我认为你不需要一般,你可以在嵌套的地方使用orWhere,如果更容易)

$attributes = ['first'=>'a','second'=>'b'];

$query->where(function ($query) use ($attributes) 
{
    foreach ($attributes as $key=>value)
    {
        //you can use orWhere the first time, doesn't need to be ->where
        $query->orWhere($key,$value);
    }
});
Run Code Online (Sandbox Code Playgroud)


Kri*_*rya 7

不使用 Modal 的另一种方式

数据库:股票 列:id,name,company_name,exchange_name,status 在此处输入图片说明

  $name ='aa'
  $stocks = DB::table('stocks')
            ->select('name', 'company_name', 'exchange_name')
            ->where(function($query) use ($name) {
                $query->where('name', 'like', '%' . $name . '%')
                ->orWhere('company_name', 'like', '%' . $name . '%');
            })
            ->Where('status', '=', 1)
            ->limit(20)
            ->get();
Run Code Online (Sandbox Code Playgroud)


小智 6

您还可以查询第一个或条件,然后再应用另一个或条件

$model = Model::where('a',1)->orWhere('b',1);
Run Code Online (Sandbox Code Playgroud)

现在对该$model变量应用另一个条件

$model1 = $model->where('c',1)->orWhere('d',1)->get();
Run Code Online (Sandbox Code Playgroud)


Maj*_*bib 6

$ a,$ b,$ c,$ d可以是查询的动态值

 ->where(function($query) use ($a, $b)
        {
            $query->where('a', $a)
                  ->orWhere('b',$b);
        })
 ->where(function($query) use ($c, $d)
        {
            $query->where('c', $c)
                  ->orWhere('d',$d);
        })
Run Code Online (Sandbox Code Playgroud)


小智 6

只需在Laravel Eloquent中使用:

$a='foo', $b='bar', $c='john', $d='doe';

Coder::where(function ($query) use ($a, $b) {
    $query->where('a', '=', $a)
          ->orWhere('b', '=', $b);
})->where(function ($query) use ($c, $d) {
    $query->where('c', '=', $c)
          ->orWhere('d', '=', $d);
})->get();
Run Code Online (Sandbox Code Playgroud)

会产生如下查询:

SELECT * FROM <table> WHERE (a='foo' or b='bar') AND (c='john' or d='doe');
Run Code Online (Sandbox Code Playgroud)


Leo*_*eon 5

您还可以使用查询范围使事情更整洁,因此您可以执行以下操作:

Invoice::where('account', 27)->notPaidAt($date)->get();
Run Code Online (Sandbox Code Playgroud)

然后在你的模型中

public function scopeNotPaidAt($query, $asAt)
{
    $query = $query->where(function ($query) use ($asAt) { 
        $query->where('paid', '=', '0000-00-00')->orWhere('paid', '>=', $asAt); 
    });
    return $query;    
}
Run Code Online (Sandbox Code Playgroud)


par*_*ini 5

YourModel::where(function ($query) use($a,$b) {
    $query->where('a','=',$a)
          ->orWhere('b','=', $b);
})->where(function ($query) use ($c,$d) {
    $query->where('c','=',$c)
          ->orWhere('d','=',$d);
});
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用:

Model::where('table_column', 'value')->orWhere('table_column', 'value')->get()
Run Code Online (Sandbox Code Playgroud)