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

Laravel: Remove an attribute in returned result

我有以下代码:

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

这 return 是这样的:

[
     {
         "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 是附加属性,而不是存储在数据库中的属性。

我想 return 将此集合返回给没有属性的用户: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,但它们似乎只适用于一维数组。不是模型 return 编辑的集合结果。

我该如何解决我的问题?

您可以将您的属性设置为隐藏在模型上 class(参见 Hidding Attributes From Json

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

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

如果你不想让它永久化,你可以使用 makeHidden() eloquent 文档中描述的方法:

Temporarily Modifying Attribute Visibility

If you would like to make some typically hidden attributes visible on a given model instance, you may use the makeVisible method. The makeVisible method returns the model instance for convenient method chaining:

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

Likewise, if you would like to make some typically visible attributes hidden on a given model instance, you may use the makeHidden method.

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

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

如果内容太多而您想保持简单,您可以对集合使用 laravel pluck 方法。

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

您可以使用

$model->offsetUnset('propertyName');

也有这方面的经验。我在这里找到了一个很好的解决方案。

但是,如果您喜欢 one-liner 解决方案,您也可以使用 Eloquent 模型的 ff 方法 class:

setHidden(array $hidden)

Ex: $user->setHidden(['name'])