Табличные фильтры Laravel

Я пытаюсь реализовать фильтры для таблицы в моем приложении 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';
 }

Схема таблицы:

Табличные фильтры Laravel

Ошибка публикации Laravel 419 обычно связана с авторизацией токена

Iftikhar uddin 15.01.2019 14:21

Я изменил свой маршрут на получение, и теперь ошибка исчезла. Единственное, что происходит сейчас, это то, что мой URL меняется.

stefan de boer 15.01.2019 14:24

Вы пробовали мою сдачу?

Stormhammer 16.01.2019 16:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
3
5 378
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Почтовые запросы по умолчанию защищены 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

  • {!! csrf_field () !!}
  • @csrf
  • <input type = "hidden" name = "_token" id = "csrf-token" value = "{{ Session::token() }}" />

Спасибо, ошибка исчезла. но теперь таблица меняется не так, как я хочу. Он показывает мне только пустую страницу, а URL-адрес изменен.

stefan de boer 15.01.2019 14:28

@stefandeboer, поскольку вы возвращаете данные из коллекции $ filter и видите пустую страницу, что означает, что $ filter возвращает пустой массив, в этом случае вы должны, по крайней мере, видеть скобки, а если вы даже не видите скобки ([]), то поделитесь пожалуйста своей таблицей и моделью.

Rafay Hassan 15.01.2019 15:09

Я обновил свой пост, теперь он показывает мою схему таблицы и мою модель.

stefan de boer 15.01.2019 15:09

@stefandeboer, что означает, что ваш фильтр возвращает пустой массив. Проверьте свои фильтры. используйте dd (); метод отладки

Rafay Hassan 15.01.2019 15:12

@stefandeboer Я думаю, проблема в этом фильтре $ filter = FilterModel :: where ('status', true); Если вы храните истину как строку в своей БД, запишите ее как $ filter = FilterModel :: where ('status', 'true'); или используйте любое реальное значение, которое вы сохранили в таблице. Если вы проверяете значение null, это должно быть похоже на $ filter = FilterModel :: whereNotNull ('status');

Rafay Hassan 15.01.2019 15:31

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

См. Документацию здесь

Но независимо от того, показываю я свое мнение или нет, разве тогда не должны отображаться соответствующие данные? сейчас он не показывает никаких данных.

stefan de boer 15.01.2019 14:39

Вы можете показать нам обновленный контроллер? вы кладете данные в редирект?

Saromase 15.01.2019 14:44

Пожалуйста, попробуйте это в своем контроллере

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, он наконец показывает данные. Но он не показывает правильные данные. Когда я нажимаю кнопку «Доставлено», запись с ожидающим статусом все еще отображается.

stefan de boer 15.01.2019 15:13

Я изменил свой ответ. Я думаю, это должно сработать. Если это так, вам также следует подумать о добавлении $request->validate(['status'=>'required']); выше $status =..... в контроллер.

Stormhammer 16.01.2019 09:41

Другие вопросы по теме