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

Yah*_*din 3 laravel laravel-5 laravel-5.1

我有以下代码:

$orders = Order::all();
return $orders;
Run Code Online (Sandbox Code Playgroud)

这返回如下内容:

[
     {
         "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"
     }
]
Run Code Online (Sandbox Code Playgroud)

请注意,这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"
     }
]
Run Code Online (Sandbox Code Playgroud)

看看收集功能,我似乎无法找到一个简单的方法:https: //laravel.com/docs/5.4/collections

我发现的唯一函数接近我想要的是:except而且forget,它们似乎只是在一维数组上工作.不是模型返回的集合结果.

我怎样才能解决我的问题?

小智 16

您可以使用

$model->offsetUnset('propertyName');
Run Code Online (Sandbox Code Playgroud)


Eli*_*res 11

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

/**
 * The attributes that should be hidden for serialization.
 *
 * @var array
 */
protected $hidden = ['qr_code'];
Run Code Online (Sandbox Code Playgroud)

该属性仍将加载,但不会显示在您的集合中.

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

暂时修改属性可见性

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

return $user->makeVisible('attribute')->toArray(); 
Run Code Online (Sandbox Code Playgroud)

同样,如果您希望在给定的模型实例上隐藏一些典型的可见属性,则可以使用makeHidden方法.

return $user->makeHidden('attribute')->toArray();
Run Code Online (Sandbox Code Playgroud)


Cla*_*ore 9

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