2016-04-24 20 views
1
// This comes in as an array - item_category[] 
$category = \Request::input('item_category'); 

Item::with('category') 
    ->when($category, function($q) use ($category) { 
     $q->whereHas('category', function($q) use ($category) { 
      $q->whereIn('category', $category); 
     }); 
    })->get(); 

こんにちは、カテゴリが通過するカテゴリのすべてのアイテムを取得しようとしています。ただし、カテゴリはフィルタであり、ユーザはこれをチェックすることもできないこともあります。したがって、when節はモデルにチェーンされます。ユーザーがitem_categoryチェックボックスのいずれかをチェックしない場合は、それがあることから、クエリが0の結果を返します以外のコードは、現在、私はLaravel - Laravelとネストされたリレーションシップをクエリします。

Item::with('category') 
    ->whereHas('category', function($q) use ($category) { 
      $q->whereIn('category', $category); 
     })->get(); 

を行う場合、これは動作しますエラー

Column not found: 1054 Unknown column 'has' in 'where clause' (SQL: select * from `items` where `has` = category) 

をスローしますこの値が通過することを期待しています。 私は本当にここで何をするのか分からない。何かアドバイス。 よろしく、

項目テーブル

id category_id title description price timestamps 

カテゴリテーブル

id category 

Item.php

public function category() 
{ 
    return $this->belongsTo('App\Category', 'category_id'); 
} 
+0

元のテーブルと最終的なMySQLクエリを表示してください。 –

+0

更新を確認してください –

+0

もう一度、必要な生のMySQLクエリを表示することを検討する必要があります。 –

答えて

0

LaravelはあなたのネストされたwhereHas(...)where('has', ...)としてではなくとして解釈されていることを思われるものあなたは欲しい。なぜか分からないけど、それは副題の仕組みだと思っています。

あなたが最初のベースクエリを作成している行うことができ、そしてこのように、それを自分でチェックし、強化します:それはむしろカテゴリより

$category = \Request::input('item_category'); 
$query = Item::with('category'); 
if ($category) { 
    $query->whereHas('category', function($q) use ($category) { 
     $q->whereIn('category', $category); 
    }); 
} 
$results = $query->get(); 

をCATEGORY_IDべきではありませんが?

+0

'when()'が 'whereHas'(Eloquentクエリービルダーとは異なります)をサポートしていないデータベースクエリービルダーのインスタンスを受け取ったときにクロージャが2番目のパラメータとして渡され、関数呼び出しが'( 'が'、 '...)'である。 –

+0

はい、そうそうです。追加ありがとう、@KemalFadillah –

関連する問題