Как сделать так, чтобы из БД удалялись нужные посты?
И так, я продолжаю разбираться с Laravel, на этот раз я затупил над удалением записей из БД, а именно:
Значится в наличии имеется таблица с постами, которую я вывожу через контроллер в представление, используя пагинацию:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use App\Models\Posts;
class PostsController extends Controller
{
public function form()
{
$del = DB::table('posts');
return view('posts.form', [
'title' => 'form title', 'paginate' => Posts::paginate(15), 'del' => $del
]);
}
}
В этом самом представлении я пытаюсь сделать таблицу, в которой буду выводить все посты с их id на экран. С этим проблем нет, но далее я хочу добавить колонку таблицы в которой будут стоять ссылки на удаление соответствующих записей:
<x-layout>
<x-slot name="title">
{{ $title }}
</x-slot>
<a href="/post/add/">добавить пост</a>
<table>
<tr>
<th>id</th>
<th>text</th>
<th>delete</th>
</tr>
@foreach($paginate as $post)
<tr>
<td>{{ $post->id }}</td>
<td>{{ $post->text }}</td>
<td>
<a href="{{ $del->where('id', $post->id)->delete() }}">Удалить</a>
</td>
</tr>
@endforeach
</table>
{{ $paginate->links() }}
</x-layoit>
И с этим у меня начинаются проблемы. Так как записи удаляются по порядку сверху вниз, на какую бы строку я не нажимал, удаляются они в общем-то, даже если я ни на какую строку не нажимаю, а просто обновляю страницу. Собственно, буду рад, если объясните, что я делаю не так.
Ответы (2 шт):
Вы вызываете удаление записей при формировании шаблона, поэтому записи у вас и удаляются при обновлении страницы.
Т.е. когда вы вставляете в шаблон код
$del->where('id', $post->id)->delete()
то этот код выполяняется сразу, при формировании страницы, а вовсе не при нажатии на ссылку, как вы предполагаете.
Чтобы удалять записи при клике по ссылке, вам надо чтобы эта ссылка вела на отдельный action контроллера и уже в этом экшене удалять запись по id, который будет передан в параметре ссылки.
Т.е. ссылка может выглядеть так
<td>
<a href="/post/delete?id ={{ $post->id }}">Удалить</a>
</td>
А уже в контроллер PostsController добавляете новую функцию для обработки URI /post/delete и в ней получаете id из запроса и по нему удаляете, а потом редиректите пользователя назад на страницу со списком.
В дальнейшем можн осделать удаление через AJAX и т.п. вещи.
Вы сделали не ссылку на удаление записи, а вызываете метод QueryBuilder'а, что и вызывает удаление записей в процессе загрузки страницы. Для удаления понадобится добавить роут (что-то вроде /posts/1/delete, где 1 - id поста) и добавить в контроллер нужный метод
роут:
Route::post('posts/{postId}/delete', [PostsController::class, 'deletePost']);
метод:
public function deletePost(Request $request, int $postId)
{
DB::table('posts')->where('id', $postId)->delete();
}