在 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 的底部。

它很有魅力!