6

几乎我希望查询选择 25 岁且介于 150-170 厘米或 190-200 厘米之间的用户的所有记录。

我在下面写了这个查询。然而问题是它不断吸引 25 岁或 190-200 厘米的人,而不是 25 岁的 150-170 或 25 岁的 190-200 厘米高的人。我怎样才能解决这个问题?谢谢

 $heightarray=array(array(150,170),array(190,200));
 $user->where('age',25);

   for($i=0;$i<count($heightarray);i++){
 if($i==0){
   $user->whereBetween('height',$heightarray[$i])
}else{
   $user->orWhereBetween('height',$heightarray[$i])
 }
 }
      $user->get();

编辑:我尝试了高级 wheres (http://laravel.com/docs/queries#advanced-wheres),但它对我不起作用,因为我无法将 $heightarray 参数传递到闭包中。

来自 laravel 文档

 DB::table('users')
        ->where('name', '=', 'John')
        ->orWhere(function($query)
        {
            $query->where('votes', '>', 100)
                  ->where('title', '<>', 'Admin');
        })
        ->get();
4

3 回答 3

10

就像Jeemusu和 OP 所说,你需要使用提前 wheres。但是如果你想将一个变量传递给闭包函数,你需要使用“ use ”方法:

$heightarray = array(array(150,170),array(190,200));

DB::table('users')
  ->where('name', '=', 'John')
  ->orWhere(function($query) use ($heightarray){
    //...
  })
  ->get();
于 2013-10-21T04:10:26.683 回答
2

我找到了答案。我需要在闭包中包含“使用”来传递我的 $heightarray 变量。一旦 $heightarray 进入,那么 laravel 的提前工作就在那里。

$heightarray=array(array(150,170),array(190,200));
  $user->where('age',25);

 $userprofile->Where(function($query) use ($heightarray) {

 for($i=0;$i<count($heightarray);i++){
 if($i==0){
 $user->whereBetween('height',$heightarray[$i])
 }else{
 $user->orWhereBetween('height',$heightarray[$i])
  }
}

 });

  $user->get();
于 2013-10-21T04:09:47.137 回答
1

这是完全未经测试的,但是查看高级 wheres的文档,您似乎想尝试这样的事情:

DB::table('users')
->where('age',25)
->Where(function($query)
{
    for($i=0;$i<count($heightarray);i++){
       if($i==0){
          $query->whereBetween('height', $heightarray[$i]);
       }else{
          $query->orWhereBetween('height', $heightarray[$i]);
       }
    }
})->get();
于 2013-10-21T03:52:00.667 回答