2017-10-04 8 views
0

Laravel brut db Ma requête comme ceci:Comment puis-je ajouter une condition dans la larve db raw?

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; 
} 

Je veux ajouter la condition

Si le prix est pas nul, il ajoutera le prix de condition sur la where

Par exemple, le prix = 1000 , la requête sur la where comme ceci:

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

Si le prix = null, la condition non exécuté

Comment puis-je le faire?

Mise à jour

je change légèrement mon flux de code

J'essaie comme ceci:

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; 
} 

Et ça marche

Comment pensez-vous?

Que ma solution soit correcte? Ou vous avez une meilleure solution?

+1

Prenez une variable avec 'prix $ = array_column ($ request-> get ('prix'));' et 'faire -> when' requête avec la condition 'where'! Il s'exécute quand le prix est en demande! –

Répondre

0

Essayez quelque chose comme ci-dessous le code avec votre état where:

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

OU

$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(); 

Hope this vous aide!

+0

Et si vous utilisiez 'DB: raw'? –

+0

Cela ne semble pas m'aider. Essayez de voir mon cas. Select, from, group by sont dans db: raw. Je veux ajouter une condition à l'intérieur de db: raw –

+0

Vous pouvez le faire dans DB :: raw! Placez votre code de DB :: raw dans ma requête et essayez-le! Je pense que c'est du travail. –

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

Peut-il ajouter la condition dans' DB: raw'? Parce que votre code est si long –

+0

Oui ce serait sql condition pas php condition –

0

Vous pouvez utiliser Advanced Join Clauses dans Query Builder

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

Comment ajouter une condition si elle utilise 'DB: raw' comme mon cas? –