【问题标题】:Laravel Table FiltersLaravel 表过滤器
【发布时间】:2019-01-15 13:19:11
【问题描述】:

我正在尝试在我的 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 419 post 错误通常与令牌授权有关
  • 我将路由更改为 get ,现在错误消失了。现在唯一发生的事情是我的网址发生了变化。
  • 你试过我的改变了吗?

标签: laravel filter eloquent frameworks


【解决方案1】:

您正在发出 POST 请求。在每个 POST 请求中,Laravel 都会检查它在 POST 请求中找不到的 CSRF 令牌,因为您的表单缺少 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
  • &lt;input type="hidden" name="_token" id="csrf-token" value="{{ Session::token() }}" /&gt;

【讨论】:

  • 谢谢,错误消失了。但现在桌子并没有像我想要的那样改变。它只显示一个空白页面,并且 URL 已更改。
  • @stefandeboer 当您从 $filter 集合返回数据时,您会看到一个空白页,这意味着 $filter 返回一个空数组,在这种情况下,您至少应该看到括号,如果没有甚至看到括号([])然后请分享您的表格和模型。
  • 我更新了我的帖子,所以现在它显示了我的表架构和我的模型。
  • @stefandeboer 这意味着您的过滤器返回一个空数组。检查您的过滤器。使用 dd();调试方法
  • @stefandeboer 我认为问题出在这个过滤器中 $filter = FilterModel::where('status', true);如果您将 true 作为字符串存储在数据库中,则将其写为 $filter = FilterModel::where('status', 'true');或使用您存储在表中的任何实际值。如果您正在检查 null 那么它应该像 $filter = FilterModel::whereNotNull('status');
【解决方案2】:

Post requests are protected by csrf by default。使用 @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>

【讨论】:

    【解决方案3】:

    您只显示一个空白页面,因为您的方法返回一些数据,而不是视图。 您需要显示一个视图,或者使用重定向方法重定向

    See Documentation here

    【讨论】:

    • 但是不管我有没有显示我的视图,那不应该显示相应的数据吗?现在它没有显示任何数据。
    • 你能告诉我们你的控制器更新了吗?您将数据放入重定向中?
    【解决方案4】:

    请在你的控制器中试试这个

    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,它终于显示数据了。但它没有显示正确的数据。当我点击 Delivered 按钮时,状态为 pending 的记录仍然显示。
    • 我修改了我的答案。我认为这应该有效。如果是这样,您还应该考虑在控制器中在$status =..... 上方添加$request-&gt;validate(['status'=&gt;'required']);
    猜你喜欢
    • 2014-09-23
    • 2021-06-18
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    相关资源
    最近更新 更多