排除 Laravel 会附加模型结果中的值
Posted
技术标签:
【中文标题】排除 Laravel 会附加模型结果中的值【英文标题】:Excluding Laravel appends values from model results 【发布时间】:2016-01-29 02:07:59 【问题描述】:Laravel 可以选择为每个模型添加一个 $appends
数组,通过为每个模型添加访问器,使附加值自动可用,就好像它们是数据库属性一样。
这通常非常方便,但在这种情况下,我只需要获取我放入 select()
的字段,因为 DataTables 只期待我发送给它的内容。
例子:
Item::select(['image', 'name', 'color']);
将返回属性中color
之后的附加字段。
返回结果时如何强制排除附加值?
或者,我如何让 DataTables 忽略某些属性?
不确定哪条路线的时间成本最低。
目前使用yajra/laravel-datatables
包发送数据到jQuery DataTables AJAX请求。
【问题讨论】:
【参考方案1】:您可以调用集合对象中的每个函数,然后使用 setHidden 方法来排除不需要的字段,例如这样
$item= Item::select(['image', 'name', 'color'])->get()->each(function($row)
$row->setHidden(['appendedField1', 'appendedField2']);
);
对于 yajra/laravel-datatables,您可以使用类似的东西
$item= Item::select(['image', 'name', 'color']);
return Datatables::of($item)->remove_column('appendedField1');
【讨论】:
不幸的是,在传递给yajra/laravel-datatables
包之前,我不能在结果上使用get()
,该包通过AJAX 将其传递给jQuery DataTables 包。忘了说那个包了。否则这将是一个完美的解决方案!
我认为你可以在 yajra/laravel-datatables 包中使用 remove_column('columnName') 方法。
为了解决这个问题,我在我的Item
模型上公开了$appends
,创建了变量$DT = Datatables::of($items);
,然后在返回make()
之前使用了call_user_func_array([$DT, 'removeColumn'], $items->first()->appends);
。如果传递数组,则必须使用 yajra/laravel-datatables-oracle
v3 以这种方式调用。
更正,不能那样做,否则会弄乱分页。必须为其创建静态方法,我已在解决方案中发布了该方法。 +1 你的回答帮助我找出完整的解决方案。【参考方案2】:
为了解决这个问题,我将此方法添加到我的 Item
模型中:
public static function getAppends()
$vars = get_class_vars(__CLASS__);
return $vars['appends'];
然后在控制器中使用如下代码:
$items = Item::select(['image', 'name', 'color']);
$DT = Datatables::of($items);
call_user_func_array([$DT, 'removeColumn'], Item::getAppends()); // Has to be called this way with yajra/laravel-datatables-oracle v3.* if passing an array.
return $DT->make(true);
【讨论】:
以上是关于排除 Laravel 会附加模型结果中的值的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent 在结果中附加一个非关系数据
将 for 循环的结果附加到 Laravel 中的 eloquent 输出