2017-03-06 46 views
0

我想產生這樣一個查詢封閉:動態生成基於輸入搜索(Laravel/Elequent)

select * from `recipes` 
        where ((`menu` LIKE '%dinner%' or `menu` LIKE '%lunch%') 
        and (`type` LIKE '%steak%' or `soort` LIKE '%chicken%')) 
        order by RAND() asc limit 1 

雖然我的輸入是這樣的:

"menu1" => "dinner" "menu2" => "lunch" "type1" => "steak" "type2" => "chicken"

這就是我的代碼現在的樣子PHP

foreach ($input as $key => $value) { 
      $key = preg_replace('/[0-9]+/', '', $key); 
      if($oldKey == $key){ 
       $andOr = 'OR'; 
      } else { 
       $andOr = 'AND'; 
      } 

       if($oldKey == $key) 
       { 
        $query->where(function($query) use ($key, $value){ 
         $query->where($key, "LIKE", "%$value%"); 
        }); 
       } else { 
        $query->orWhere(function($query) use ($key, $value) 
        { 
         $query->orWhere($key, "LIKE", "%$value%"); 
        }); 
       } 

      } 

      $oldKey = $key; 
    }); 

    $recipe = $query->orderBy(DB::raw('RAND()'))->limit(1)->get(); 

但遺憾的是這產生這樣的事情:

select * from `recipes` 
         where ((`menu` LIKE '%dinner%') 
         or (`menu` LIKE '%lunch%') 
         or (`type` LIKE '%steak%') 
         or (`type` LIKE '%chicken%')) 
       order by RAND() asc limit 1 

這是不正確的。

我想使這段代碼動態,所以我可以給它或多或少的輸入變量,並仍然生成「有效」的查詢。有效的我的意思是括號放在第一個查詢中。

我希望我把所有事情都清楚了,謝謝你的幫助!

回答

0

更改您的輸入格式

"menu" => ["dinner", "lunch" ] "type" => ["steak", "chicken"]

您可以使用此方法做到這一點。

<input type="checkbox" name="menu[]" value="dinner">

而現在,會更容易管理器,您的代碼數據。

foreach ($input as $key => $value) { 
    $query->where(function($query) use ($key, $value){ 
     foreach($value as $item) { 
      $query->orWhere($key, "LIKE", "%{$item}%"); 
     } 
    }); 
} 

$recipe = $query->orderBy(DB::raw('RAND()'))->limit(1)->get(); 

我沒有測試它,但這是你應該遵循的路徑。