Abhishek Kumar
Abhishek Kumar

Reputation: 2286

laravel advanced wheres not working

my function with advanced wheres is not giving any syntax error but its not even working. Its displaying. i have written this function following this example http://laravel.com/docs/queries#advanced-wheres

public function getData($wheres1 = array(),$wheres2 = array(),$wheres3 = array(),$wheres4 = array(),$wheres5 = array(),$wheres6 = array(),$wheres7 = array())
    {
    $query = Listing::query();
    $result = array();

      $query = $query->where(function($q){

      if(!empty($wheres1)){

        $count=0;
       foreach($wheres1 as $where){ 
       if($count==0)
       { $q = $q->where($where['field'], $where['operator'], $where['value']);
               $count++;
       }
       else
         $q = $q->orWhere($where['field'], $where['operator'], $where['value']);

       }
     }

      })->where(function($q){

            if(!empty($wheres2)){

        $count=0;
       foreach($wheres2 as $where){ 
       if($count==0)
       { $q = $q->where($where['field'], $where['operator'], $where['value']);
               $count++;
       }
       else
         $q = $q->orWhere($where['field'], $where['operator'], $where['value']);

       }
     }



      })->where(function($q){

        if(!empty($wheres3)){

        $count=0;
       foreach($wheres3 as $where){ 
       if($count==0)
       { $q = $q->where($where['field'], $where['operator'], $where['value']);
               $count++;
       }
       else
         $q = $q->orWhere($where['field'], $where['operator'], $where['value']);

       }
     }


      });


    $result = $query->orderBy('id', 'desc')->paginate(3);
    return $result;

    }    

Upvotes: 0

Views: 162

Answers (2)

The Alpha
The Alpha

Reputation: 146269

You may try this approach:

$query = Listing::query();
if(is_array($wheres1) && count($wheres1)) {
    $first = array_shift($wheres1);
    $query->where($first['field'], $first['operator'], $first['value']);
    if(count($wheres1)) {
        foreach($wheres1 as $where) {
            $query->orWhere($wheres['field'], $wheres['operator'], $wheres['value']);
        }
    }
}

Now repeat the same process for rest of the wheres, for example ($wheres2):

if(is_array($wheres2) && count($wheres2)) {
    $first = array_shift($wheres2);
    $query->where($first['field'], $first['operator'], $first['value']);
    if(count($wheres2)) {
        foreach($wheres2 as $where) {
            $query->orWhere($wheres['field'], $wheres['operator'], $wheres['value']);
        }
    }
}

At last:

return $query->orderBy('id', 'desc')->paginate(3);

Upvotes: 0

Razor
Razor

Reputation: 9855

You need to add use for each where

$query = $query->where(function($q) use ($wheres1) {
....
}

Upvotes: 2

Related Questions