Использование метода unique () при создании списка опций в шаблоне блейда

#laravel #laravel-blade

#laravel #laravel-блейд

Вопрос:

Мне нужно сгенерировать список опций в моей форме из столбца с именем product_name в моей базе данных. Я делаю это в шаблоне блейда следующим образом:

 <select name="product" >
    <option value="" disabled>Click to select</option>
    @foreach ($products as $product)
	<option value="{{$product->product_name}}">{{$product->product_name}}</option>
	@endforeach
</select>  

И контроллер выглядит следующим образом:

 public function index()
{
    $products = Product::all();
    return view('products.index', compact('products'));
}
  

До сих пор это работало хорошо, однако по мере роста ассортимента моей продукции в моей базе данных появляется все больше и больше строк product_name , поскольку каждая строка уникальна по своему описанию, а не по названию. Таким образом, в моей форме есть несколько дублирующихся опций.

Я понимаю, что в Laravel есть unique() метод для коллекций. В этом случае на каждой итерации @foreach я получаю строку в качестве опции и, следовательно, unique() не могу быть использован.

Какие еще способы существуют в Laravel для фильтрации дублирующихся данных?

Комментарии:

1. Пожалуйста, дополните свой вопрос кодом контроллера, чтобы мы могли лучше рассмотреть проблему.

2. Привет! Я обновил свой вопрос соответствующим кодом контроллера

3. Вы можете использовать distinct() . т. е. $products = Product::query()->distinct()->get(); или $products = Product::query()->distinct('product_name')->get();

Ответ №1:

Вы можете сгруппировать свой запрос для столбца название продукта и описание продукта и получить результат следующим образом-

 public function index()
{
    $products = Product::select('product_name', 'product_description')
        ->orderBy('product_name') 
        ->groupBy('product_name', 'product_description')
        ->get();

    return view('products.index', compact('products'));
}
  

Обновил запрос с помощью order by.

Комментарии:

1. Спасибо за отзыв. Я только что попробовал это. Мне удалось успешно удалить дубликаты названий продуктов. Если бы мне нужно было отсортировать его, я просто добавил -> сортировать () это правильно?

2. Вы можете добавить это для упорядочивания результата- ->OrderBy(‘column’, ‘desc’)

3. Я обновил ответ, пожалуйста, взгляните и дайте мне знать, если это не сработает.

4. Это работает очень хорошо! Большое вам спасибо! Я предполагаю, что unique() тогда это неправильный способ выполнения большинства таких запросов.

5. Пожалуйста, отметьте это как ответ, если это сработало для вас. Вы можете использовать distinct, когда в качестве уникального поля требуется только один столбец.

Ответ №2:

Попробуйте использовать pluck;

 public function index()
{
    //Use pluck for selecting only specific column. You can take multiple columns as 
    well.
    $product_names = Product::pluck('product_name');
    $products = array_unique($product_names);
    return view('products.index', compact('products'));
}
  

Ответ №3:

 public function index()
{
    $products = Product::pluck('product_name', 'product_name')
                       ->toArray();

    return view('products.index', compact('products'));
}
  

Это вернет уникальные названия продуктов