Laravel Поиск Отношений

У меня есть две модели, которые связаны между собой. Я пытаюсь выполнить поиск по продуктам и отображать только фактические результаты поиска вместо ВСЕХ продуктов той категории, в которой продукт был найден. Я не хочу искать какие-либо категории, так как категории будут ВСЕГДА отображаться независимо от того, что искали и независимо от того, что было найдено.

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

12

Решение

Я не знаю, как вы смотрите результаты, но я думаю, что если вы просто хотите загрузить продукты по категориям, вы должны быть хорошими.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]