Laravel Как отображать сопутствующие товары?

#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