在 Laravel REST API 的 JSON 响应中将相关对象显示为字符串?
Present related objects as strings on JSON responses on a Laravel REST API?
我正在 Laravel 上编写 REST API 并且我正在利用多态关系。这么多资源都绑定了images
。当我创建响应时,使用这样的预加载:
return User::with('image')->find($id);
我得到这样的结果:
{
id: 27,
image: {
id: 340,
url: "https://amazonbucket.com/2lBqWzDme.jpg",
created_at: "2015-01-28 17:21:17",
updated_at: "2015-01-28 18:28:42",
}
}
相反,我希望它像这样自动输出 url
作为 string
,因此在前端更容易:
{
id: 27,
image: "https://amazonbucket.com/2lBqWzDme.jpg"
}
我尝试使用 Image::toJson()
方法,但没有成功。我可以使用 User::toJson()
方法,但我必须对所有使用 images
的 existing/upcoming 实例执行此操作。想法?
重写 Image::toJson()
方法在这里无济于事。在这种情况下,截断的调用堆栈将是 User::toJson()
--> User::toArray()
--> Image::toArray()
.
所以,现在的问题是,为了做你想做的事,你必须重写 Image::toArray()
方法,这样它就不再是 returns 数组,而是 returns 包含 url 值的字符串。我无法想象这会过得很好,但我以前从未做过。
如果您只想修改 Image
class,最接近的方法是将 Image::visible
属性指定为仅包含 url
钥匙。这会将您的 JSON 变成:
{
id: 27,
image: {
url: "https://amazonbucket.com/2lBqWzDme.jpg",
}
}
除此之外,您正在寻找一个解决方案,您需要修改每个 class 可成像的内容。但是,您可以将所需的功能提取到其他 class 扩展的特征或基础 class 中。无论哪种情况,您都希望修改 toArray()
方法,而不是 toJson()
方法。
正如通常发生的那样,我找到了一种更好、侵入性更小的方法来寻找其他东西:
只需将 $appends
protected 属性添加到您的模型并设置 getImageAttribute()
方法。
protected $appends = ['image'];
function getImageAttribute() {
return $this->images()->first()->url;
}
检查 http://laravel.com/docs/4.2/eloquent#converting-to-arrays-or-json 的底部。
它很有魅力!
我正在 Laravel 上编写 REST API 并且我正在利用多态关系。这么多资源都绑定了images
。当我创建响应时,使用这样的预加载:
return User::with('image')->find($id);
我得到这样的结果:
{
id: 27,
image: {
id: 340,
url: "https://amazonbucket.com/2lBqWzDme.jpg",
created_at: "2015-01-28 17:21:17",
updated_at: "2015-01-28 18:28:42",
}
}
相反,我希望它像这样自动输出 url
作为 string
,因此在前端更容易:
{
id: 27,
image: "https://amazonbucket.com/2lBqWzDme.jpg"
}
我尝试使用 Image::toJson()
方法,但没有成功。我可以使用 User::toJson()
方法,但我必须对所有使用 images
的 existing/upcoming 实例执行此操作。想法?
重写 Image::toJson()
方法在这里无济于事。在这种情况下,截断的调用堆栈将是 User::toJson()
--> User::toArray()
--> Image::toArray()
.
所以,现在的问题是,为了做你想做的事,你必须重写 Image::toArray()
方法,这样它就不再是 returns 数组,而是 returns 包含 url 值的字符串。我无法想象这会过得很好,但我以前从未做过。
如果您只想修改 Image
class,最接近的方法是将 Image::visible
属性指定为仅包含 url
钥匙。这会将您的 JSON 变成:
{
id: 27,
image: {
url: "https://amazonbucket.com/2lBqWzDme.jpg",
}
}
除此之外,您正在寻找一个解决方案,您需要修改每个 class 可成像的内容。但是,您可以将所需的功能提取到其他 class 扩展的特征或基础 class 中。无论哪种情况,您都希望修改 toArray()
方法,而不是 toJson()
方法。
正如通常发生的那样,我找到了一种更好、侵入性更小的方法来寻找其他东西:
只需将 $appends
protected 属性添加到您的模型并设置 getImageAttribute()
方法。
protected $appends = ['image'];
function getImageAttribute() {
return $this->images()->first()->url;
}
检查 http://laravel.com/docs/4.2/eloquent#converting-to-arrays-or-json 的底部。
它很有魅力!