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
我发现的唯一接近我想要的功能是:except
和 forget
,但它们似乎只适用于一维数组。不是模型 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'])
我有以下代码:
$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
我发现的唯一接近我想要的功能是:except
和 forget
,但它们似乎只适用于一维数组。不是模型 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'])