Laravel 数据表 - 只有 return 请求的列,删除了额外的模型字段

Laravel datatables - only return the requested columns, removing the additional model fields

我正在网站上使用 Laravel datatables

数据通过AJAX加载。在我的前端代码中,我 select table 需要哪些列:

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 关系都是 return编辑。基本上,对于 table 中的每一行,我 return 一大堆 不应该 在前端可用的无用数据。

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

我唯一能做的就是 select eloquent 查询中的所需字段:

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

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

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

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

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

响应中只会发送此方法中指定的列。