首页 > 解决方案 > Laravel 数据表 - 只返回请求的列,删除额外的模型字段

问题描述

我在网站上使用Laravel 数据表

数据通过 AJAX 加载。在我的前端代码中,我选择表格需要的列:

var dataTable = $('#products-table').DataTable({
          serverSide: true,
          ajax: {
            'url': '{!! route('myroute') !!}',

          },
          columns: [
            {data: 'brand_model', orderable: false},
            {data: 'status', className: 'dt-body-center', orderable: false},
            {data: 'sale_price', className: 'dt-body-right'},
            {data: 'image_url', orderable: false, className: 'table-image'},
            {data: 'actions', orderable: false, className: 'table-actions'}
          ],
          order: [[1, "desc"]]
        });

在后端,我目前正在构建响应,如下所示:

$products = $user->products(); // Eloquent relationship

return DataTables::of($products)
  ->editColumn('status', function ($product) { ... })
  ->addColumn('actions', function ($product) { ... })
  ...
  ->make(true);

一切都正确显示,我分析了 ajax 响应,我注意到每个列甚至user每个产品的关系都被返回。基本上,对于表中的每一行,我都会返回一大堆不应该在前端可用的无用数据。

有没有办法强制数据表构建器只包含这些字段而不包含其他所有内容?

我唯一能做的就是在 eloquent 查询中只选择所需的字段:

$products = $user->products()->select(['status', 'image_url', ... ]);

但是这个解决方案是不可行的,因为我需要大部分字段和关系来构建额外的列(即actions)。在构建所需的列,应过滤该字段。

虽然自动解决方案是完美的,但我也会考虑手动解决方案(我必须手动指定要在响应中包含哪些字段)

标签: laraveldatatableslaravel-datatables

解决方案


您可以使用包的默认方法only

return Datatables::of($products)->->only([
            'col1',
            'col2'
        ])

只有此方法中的指定列将在响应中发送。


推荐阅读