2017-07-04 4 views
1

多分これを間違った方法で実行しようとしていますが、laravelクエリビルダ内にif条件を挿入する必要があります。laravel query builder 'when'演算子を使用して同じ結果セットの列をターゲットにする方法

$name = $request->input('name'); 
$query = DB::connection('dbconxz') 
      ->table('all_items')->select('name', 'price', 'description', 'type', 'quantity', 'exempt') 
      ->where('name', 'like', "%{$name}%") 
      ->when('??? how to target the *TYPE* column?'== 'Inventory', function ($query) { 
       return $query->where('quantity', '>', 0); 
      }) 
      ->get(); 

は、私は、テーブルALL_ITEMSを検索し、名前は、ユーザーがデータベースから... 典型的なAjaxのオートコンプリートを入力しているもののようです項目のコレクションを返してAJAX自動補完を持っています。今私の問題は、 "タイプ"という列には "在庫"という単語が含まれていて、その行の数が> 0の場合のみその結果を含めることです。

アイデアはありますか?

答えて

1

これを正規のSQLで把握しましょう。 Laravelを使用して次に

SELECT name, price, description, type, quantity, exempt 
FROM all_items 
WHERE name LIKE %$name% 
    AND (
     (
      type = 'Inventory' 
      AND quantity > 0 
     ) 
     OR type <> 'Inventory' 
    ); 

、:

$name = $request->input('name'); 
$query = DB::connection('dbconxz') 
    ->table('all_items')->select('name', 'price', 'description', 'type', 'quantity', 'exempt') 
    ->where('name', 'like', "%{$name}%") 
    ->where(function ($query) { 
     return $query->where([ 
      'type', '=', 'Inventory', 
      'quantity', '>', 0 
     ]) 
     ->orWhere('type', '<>', 'Inventory'); 
    }) 
    ->get(); 
1

whenは、アプリケーションで条件を使用する場合に使用します。しかしここでは、データベースサーバーの条件が必要です。以下のようなことをしてください。

$query = DB::connection('dbconxz') 
      ->table('all_items as t1')->select('name', 'price', 'description', 'type', 'quantity', 'exempt') 
      ->where('name', 'like', "%{$name}%") 
      ->where(function ($query1) { 
       $query1->where(function ($query2) { $query2->where('type', '==', 'Inventory')->where('quantity', '>', 0); }) 
         ->orWhere('type', '<>', 'Inventory') 
      }) 
      ->get(); 
関連する問題