排除 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 输出

Laravel Passport:发送令牌请求时的附加模型条件

laravel4 更新数据透视表中的附加列

laravel-admin 更新数据失败

Laravel 路由问题:自动重定向到根文件夹