#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'));
}
Это вернет уникальные названия продуктов