2017-10-04 200 views
0

我查詢數據庫原始laravel這樣的:如何在db raw laravel中添加條件?

public function getTopProduct($price = null) { 
    $products = DB::select(DB::raw('SELECT * 
        FROM (
         SELECT a.*, b.name AS store_name, b.address 
         FROM products a 
         JOIN stores b ON b.id = a.store_id 
         WHERE a.status = 1             
        ) AS product 
        GROUP BY store_id') 
     ); 
    return $products; 
} 

我想補充條件

如果價格不爲空,這將增加對where

例如條件,漲價= 1000 ,然後在where本查詢:

WHERE a.status = 1 AND a.price < 1000 

如果價格= null,則條件AND a.price < 1000未執行

我該怎麼辦?

更新

我稍微改變我的代碼流

我嘗試這樣的:

public function getTopProduct($price) 
{ 
    if($price == 1) 
     $price_condition = 'WHERE price > 1000'; 
    else if($price == 2) 
     $price_condition = 'WHERE price >= 500 AND a.price <= 1000'; 
    else if($price == 3) 
     $price_condition = 'WHERE price < 500'; 
    else 
     $price_condition = ''; 


    $products = DB::select('SELECT * 
        FROM (
         SELECT a.*, b.name AS store_name, b.address 
         FROM products a 
         JOIN stores b ON b.id = a.store_id 
         WHERE a.status = 1             
        ) AS product 
        GROUP BY store_id 
        '.$price_condition 
       ); 
    return $products; 
} 

和它的作品

你怎麼看?

我的解決方案是否正確?或者你有更好的解決方案?

+1

取一個變量,'$價格= array_column($請求 - >獲取( '價格'));'和'做 - > when'用'where'條件查詢!它在價格要求時執行! –

回答

0

嘗試類似下面的代碼與where條件:

$price = array_column($request->get('price'), 'id'); 

OR

$price = $request->get('price');

$query = DB::select(DB::raw('SELECT * 
       FROM (
        SELECT a.*, b.name AS store_name, b.address 
        FROM products a 
        JOIN stores b ON b.id = a.store_id 
        WHERE a.status = 1             
       ) AS product 
       GROUP BY store_id')) 
      ->when($price == 1, function($query) use ($price) { 
        $query->where('price', '>', '1000'); 
      }) 
      ->when($price == 2, function($query) use ($price) { 
        $query->where('price', '>=', '500') 
         ->where('a.price', '<=', '1000'); 
      }) 
      ->when($price == 3, function($query) use ($price) { 
        $query->where('price', '<', '500'); 
      }) 
      ->when($price == '', function($query) use ($price) { 
        $query->where('your_where_when_price_empty'); 
      }) 
      ->get(); 

希望這可以幫助你!

+0

如果使用'DB:raw'會怎麼樣? –

+0

它似乎沒有幫助我。試試看看我的情況。選擇,from,group by在db:raw內部。我想在db裏添加條件:raw –

+0

你可以在DB :: raw中做到這一點!將您的DB :: raw代碼放在我的查詢中,然後嘗試!我認爲這是工作。 –

0
public function getTopProduct($price = null) { 
if($price==null){ 
     $products = DB::select(DB::raw('SELECT * 
       FROM (
        SELECT a.*, b.name AS store_name, b.address 
        FROM products a 
        JOIN stores b ON b.id = a.store_id 
        WHERE a.status = 1             
       ) AS product 
       GROUP BY store_id') 
    ); 
}else{ 
     $products = DB::select(DB::raw('SELECT * 
       FROM (
        SELECT a.*, b.name AS store_name, b.address 
        FROM products a 
        JOIN stores b ON b.id = a.store_id 
        WHERE a.status = 1 AND a.price='.$price.'             
       ) AS product 
       GROUP BY store_id') 
    ); 
} 
return $products; 
} 
+0

是否可以在'DB:raw'內添加條件?因爲你的代碼這麼久 –

+0

是的,這將是SQL條件不是PHP的條件 –

0

您可以使用Advanced Join Clauses在查詢生成器

DB::table('products') 
     ->join('stores', function ($join) use ($price) { 
      $query = $join->on('stores.id', '=', 'products.store_id') 
          ->where('products.status', '=', 1); 

      if (!empty($price)) { 
       $query->where('products.price', '<', 1000); 
      } 
     }) 
     ->select('products.*', 'stores.name AS store_name', 'stores.address') 
     ->groupBy('products.store_id') 
     ->get(); 
+0

如何添加條件,如果它使用'DB:raw'就像我的情況? –