関連する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
結果をどのように表示しているのかはわかりませんが、カテゴリに商品を熱心にロードするだけなら、良いと思います。
$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;
}
}