web-dev-qa-db-ja.com

Laravel検索関係

関連する2つのモデルがあります。製品を検索して、製品が見つかったカテゴリのすべての製品ではなく、実際の検索結果のみを表示しようとしています。何を検索しても、何が見つかっても、常にカテゴリが表示されるため、カテゴリを検索したくありません。

Example. I have the following categories:

- Food
- Drinks
- Candy

My "Food" category has the following products:

- Strawberry
- Apple
- Banana

My "Drinks" category has the following products:

- Banana Cocktail
- Beer
- Cola

My "Candy" category has the following products:

- Strawberry Lollipop
- Chocolate Bar
- Banana Ice Cream

だから、私が達成したいのは次のことです。 「バナナ」という商品を検索します。表示したいのは:

Category Food
- Product Banana

Category Drinks
- Product Banana Cocktail

Category Candy
- Product Banana Ice Cream

しかし、私の問題は、コードで「バナナ」の検索を実行すると、バナナが見つかったカテゴリが表示され、検索した製品のみではなく、そのカテゴリのすべての製品が返されて表示されることです。検索した商品だけが表示されるようにするにはどうすればよいですか?

カテゴリーモデル:

class Categories extends Eloquent {

    public function products()
    {
        return $this->hasMany('Products');
    } 
}

製品モデル:

class Products extends Eloquent {

    public function categories()
    {
        return $this->belongsTo('Categories');
    }
}

私のコントローラー:

    $searchString       = Input::get('search');

    if($searchString)
    {
        $categories = Categories::with('products')->orderBy($order, $by)->whereHas('products', function ($query) use ($searchString){
            $query->where('name', 'like', '%'.$searchString.'%');
        })->get();
    }
    else {
        $categories     = Categories::with('products')->orderBy($order, $by)->get();
    }

私の見解:

@foreach($categories as $category)
    {{ $category->name }} // Show the category name

    @foreach($category->products as $product)
    {{ $product->name }} // Show all products in that category

    @endforeach
@endforeach
15
Hardist

結果をどのように表示しているのかはわかりませんが、カテゴリに商品を熱心にロードするだけなら、良いと思います。

$categories = Categories::whereHas('products', function ($query) use ($searchString){
        $query->where('name', 'like', '%'.$searchString.'%');
    })
    ->with(['products' => function($query) use ($searchString){
        $query->where('name', 'like', '%'.$searchString.'%');
    }])->get();

foreach($categories as $category){
    echo $category->name . ':' . PHP_EOL;
    foreach($category->products as $product){
        echo . '-' . $product->name . PHP_EOL;
    }
}
24
Pawel Bieszczad