#laravel
Вопрос:
У меня есть контроллер магазина . Теперь я показываю товары в случайном порядке из базы данных. Вот код
$productsLike = Product::with('categories')->where('slug', '!=', $slug)->inRandomOrder()->take(4)->get();
Что я должен сделать, чтобы отобразить продукты, относящиеся к той же категории, что и текущий продукт?
Ответ №1:
Вы можете проверить это с помощью идентификатора категории.
$productsLike = Product::with('categories')
->where('category_id_column', $category_id)
->where('slug', '!=', $slug)
->inRandomOrder()->take(4)->get();
Ответ №2:
Я бы сделал local scope
на вашей Product
модели, чтобы сделать вещи многоразовыми.
public function scopeRelatedProducts($query, $count = 10, $inRandomOrder = true)
{
$query = $query->where('category_id', $this->category_id)
->where('slug' '!=' $this->slug);
if ($inRandomOrder) {
$query->inRandomOrder();
}
return $query->take($count);
}
Тогда вы могли бы сделать что-то вроде:
$related = Product::relatedProducts(4, true)->with('categories')->get();
Это предполагает, что столбец, в котором в вашей Product
таблице хранится отношение к a Category
, соответствует соглашению об именовании Laravel (например RelatedModelName_id
).
Вы также можете slug_id
заменить его на Product
id
Затем вы можете использовать полученную $related
переменную в своем представлении, поэтому, предполагая, что вы используете описанное выше в Product
show
методе контроллера, вы можете сделать:
class ProductController
{
public function show (Product $product)
{
$related = $product->relatedProducts(4, true)->with('categories')->get();
return view('products.show', compact('product', 'related');
}
}
@foreach ($related as $item)
<h5>{{ $item->name }}</h5>
<p>{{ $item->description }}</p>
@endforeach