Laravel:删除返回结果中的属性

时间:2017-08-19 23:11:17

标签: laravel laravel-5 laravel-5.1

我有以下代码:

$orders = Order::all();
return $orders;

返回如下内容:

[
     {
         "id": 123,
         "qr_code": "foo.png",
         "qr_code_url": "http://example.com/foo.png"
     },
     {
         "id": 112,
         "qr_code": "bar.png",
         "qr_code_url": "http://example.com/var.png"
     }
]

请注意,qr_code_url是附加属性,而不是存储在数据库中的属性。

在这种情况下,我想将此集合返回给没有属性qr_code的用户。像这样:

[
     {
         "id": 123,
         "qr_code_url": "http://example.com/foo.png"
     },
     {
         "id": 112,
         "qr_code_url": "http://example.com/var.png"
     }
]

查看集合函数,我似乎找不到一个简单的方法来执行此操作: https://laravel.com/docs/5.4/collections

我发现的唯一功能是:exceptforget,但它们似乎只适用于1维数组。不是模型返回的集合结果。

如何解决我的问题?

4 个答案:

答案 0 :(得分:8)

您可以将属性设置为隐藏在模型类上(请参阅Hidding Attributes From Json

/**
 * The attributes that should be hidden for serialization.
 *
 * @var array
 */
protected $hidden = ['qr_code'];

该属性仍会加载,但不会在您的收藏中显示。

如果您不想永久保留,可以使用文档中所述的makeHidden()雄辩方法:

  

暂时修改属性可见性

     

如果您想要显示一些通常隐藏的属性   在给定的模型实例中,您可以使用makeVisible方法。该   makeVisible方法返回模型实例以方便方法   链接:

return $user->makeVisible('attribute')->toArray(); 
     

同样,如果你   想要在给定的内容上隐藏一些典型的可见属性   模型实例,您可以使用makeHidden方法。

return $user->makeHidden('attribute')->toArray();

答案 1 :(得分:3)

你可以使用

$model->offsetUnset('propertyName');

答案 2 :(得分:2)

构建api时,推荐的控制输出数据的方法是使用fractal变换器。

如果它很多并且你想保持简单,你可以在集合上使用laravel pluck方法。

答案 3 :(得分:1)

$eloquentCollection->transform(function (Model $result) use ($forgetThisKey) {
    $attributes = $result->getAttributes();
    unset($attributes[$forgetThisKey]);
    $result->setRawAttributes($attributes, true);
    return $result;
});