我有以下代码:
$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
我发现的唯一功能是:except
和forget
,但它们似乎只适用于1维数组。不是模型返回的集合结果。
如何解决我的问题?
答案 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;
});