Я пытаюсь реализовать фильтры для таблицы в моем приложении Laravel. Например, у меня есть таблица заказов со столбцом «статус заказа». Я хочу иметь кнопку, по которой я могу нажимать, чтобы видеть все доставленные заказы (кроме отложенных). Я попробовал дать мне пустую страницу и измененный URL. Это то, что я пытаюсь сделать.
Вид
<form action = "{{ action('FilterController@status_filter') }}" method = "POST">
@csrf
<button type = "submit" name = "pending" value = "1">Pending</button>
<button type = "submit" name = "delivered" value = "2">Delivered</button>
</form>
@if (count ($info) > 0)
<table>
<thead>
<th>orderNumber</th>
<th>orderDate</th>
<th>shippedDate</th>
<th>status</th>
<th>comments</th>
<th>customerNumber</th>
</thead>
@foreach ($info as $info)
<tr>
<td>{{ $info->orderNumber }}</td>
<td>{{ $info->orderDate }}</td>
<td>{{ $info->shippedDate }}</td>
<td>{{ $info->status }}</td>
<td>{{ $info->comments }}</td>
<td>{{ $info->customerNumber }}</td>
</tr>
@endforeach
@endif
Контроллер
<?php
public function status_filter(Request $request)
{
$filter = FilterModel::where('status', true);
if ($request->has('1')) {
$filter->where('status', $pending);
}
if ($request->has('2')) {
$filter->where('status', $delivered);
}
return $filter->get();
return redirect('filter', ['filter' => $filter]);
}
Маршрут
Route::post('status_filter', 'FilterController@status_filter');
Модель:
class FilterModel extends Model
{
protected $table = 'orders';
protected $primarykey = 'orderNumber';
}
Схема таблицы:
Я изменил свой маршрут на получение, и теперь ошибка исчезла. Единственное, что происходит сейчас, это то, что мой URL меняется.
Вы пробовали мою сдачу?






Почтовые запросы по умолчанию защищены csrf. Используйте @csrf, чтобы добавить токен csrf в вашу форму.
<form action = "{{ action('FilterController@status_filter') }}" method = "POST">
@csrf
<button type = "submit" name = "pending" value = "1">Pending</button>
<button type = "submit" name = "delivered" value = "2">Delivered</button>
</form>
Вы делаете запрос POST. При каждом запросе POST Laravel проверяет токен CSRF, который он не найдет в вашем запросе POST, потому что в вашей форме отсутствует токен CSRF. Ваша форма
<form action = "{{ action('FilterController@status_filter') }}" method = "POST">
<button type = "submit" name = "pending" value = "1">Pending</button>
<button type = "submit" name = "delivered" value = "2">Delivered</button>
</form>
и это должно быть
<form action = "{{ action('FilterController@status_filter') }}" method = "POST">
@csrf
<button type = "submit" name = "pending" value = "1">Pending</button>
<button type = "submit" name = "delivered" value = "2">Delivered</button>
</form>
есть несколько способов добавить токен CSRF
<input type = "hidden" name = "_token" id = "csrf-token" value = "{{ Session::token() }}" />Спасибо, ошибка исчезла. но теперь таблица меняется не так, как я хочу. Он показывает мне только пустую страницу, а URL-адрес изменен.
@stefandeboer, поскольку вы возвращаете данные из коллекции $ filter и видите пустую страницу, что означает, что $ filter возвращает пустой массив, в этом случае вы должны, по крайней мере, видеть скобки, а если вы даже не видите скобки ([]), то поделитесь пожалуйста своей таблицей и моделью.
Я обновил свой пост, теперь он показывает мою схему таблицы и мою модель.
@stefandeboer, что означает, что ваш фильтр возвращает пустой массив. Проверьте свои фильтры. используйте dd (); метод отладки
@stefandeboer Я думаю, проблема в этом фильтре $ filter = FilterModel :: where ('status', true); Если вы храните истину как строку в своей БД, запишите ее как $ filter = FilterModel :: where ('status', 'true'); или используйте любое реальное значение, которое вы сохранили в таблице. Если вы проверяете значение null, это должно быть похоже на $ filter = FilterModel :: whereNotNull ('status');
Вы показываете только пустую страницу, потому что ваш метод возвращает некоторые данные, а не представление. Вам нужно отобразить представление или перенаправить с использованием метода перенаправления
Но независимо от того, показываю я свое мнение или нет, разве тогда не должны отображаться соответствующие данные? сейчас он не показывает никаких данных.
Вы можете показать нам обновленный контроллер? вы кладете данные в редирект?
Пожалуйста, попробуйте это в своем контроллере
public function status_filter(Request $request) {
$status = $request->status;
$return FilterModel::where('status', $status)->get();
}
и твоя форма
<form action = "{{ action('FilterController@status_filter') }}" method = "POST">
@csrf
<button type = "submit" name = "status" value = "pending">Pending</button>
<button type = "submit" name = "status" value = "delivered">Delivered</button>
</form>
Спасибо @Stormhammer, он наконец показывает данные. Но он не показывает правильные данные. Когда я нажимаю кнопку «Доставлено», запись с ожидающим статусом все еще отображается.
Я изменил свой ответ. Я думаю, это должно сработать. Если это так, вам также следует подумать о добавлении $request->validate(['status'=>'required']); выше $status =..... в контроллер.
Ошибка публикации Laravel 419 обычно связана с авторизацией токена