До сих пор мне приходилось нажимать кнопку удаления каждый раз, когда я хотел удалить категорию. Поэтому, если бы я хотел удалить 10 категорий, мне пришлось бы нажать кнопку удаления 10 раз. Вот почему я сейчас пытаюсь установить флажок, а затем просто перебирать проверенные категории, однако я не уверен, что делаю это с как можно меньшим количеством запросов.
Мой флажок выглядит так:
<form method="POST" action="{{ route('deleteCategories') }}">
@foreach($categories as $category)
<input type="checkbox" name="categories[]" value="{{ $category->id }}">{{ $category->name }}<br>
@endforeach
<button class='delete-btn' type="submit">Delete</button>
{{ csrf_field() }}
{{ method_field('delete') }}
</form>
И моя функция deleteCategories () до сих пор выглядит так:
public function deleteCategories(Request $request){
if (!Auth::user()->hasRole('Admin')) {
return redirect()->back();
} else if (Auth::user()->hasRole('Admin')) {
$categories = $request['categories'];
foreach ($categories as $category) {
$categoryToDelete = Category::where('id', $category)->first();
$categoryName = $categoryToDelete->image_file_name;
$categoryToDelete->delete();
Storage::delete('public/uploads/categories/'.$categoryName);
Storage::delete('public/uploads/categories/thumbnails/'.$categoryName);
}
return redirect()->back();
}
}
Как видите, для каждой категории $ в $ category я запускаю запрос, чтобы найти категорию с этим идентификатором, а затем удаляю ее из базы данных и локального хранилища. Это означает, что если я выбрал 4 флажка, мне нужно было выполнить 4 запроса, чтобы найти эти конкретные категории, а затем удалить их.
Есть ли лучший способ сделать это с меньшим количеством запросов? Я открыт для редактирования как HTML, так и PHP, если это сделает его быстрее, более читабельным, более масштабируемым и т. Д.
использование whereIn
:
Category::whereIn('id', $request->get('categories'))->delete();
Замечания: Если вы не хотите, чтобы записи были окончательно удалены, убедитесь, что Category
модель настроена на обработку мягких удалений.
Других решений пока нет …