只从hasOne Relation获取String

时间:2016-06-27 13:23:40

标签: json laravel eloquent relationship

我有两种模式:

a)食谱 b)用户

每个食谱都有一个用户。当(REST)请求一个Recipe时,我想在我的JSON答案中得到相关用户的名字,如下所示:

{
  "id": 1,
  "user_id": 1,
  "name": "Recipe Name",
  "description": "Description goes here",
  "userName": "Testuser"
}

我得到的是:

{
  "id": 1,
  "user_id": 1,
  "name": "Recipe Name",
  "description": "Description goes here",
  "userName": "Testuser",
  "user": {
    "id": 1,
    "name": "Testuser",
    "email": "mail@example.com"
  }
}

这是我在RecipeController中的功能:

public function show($id) {
    $recipe = Recipe::find($id);
    $recipe->userName = (string) $recipe->user->name;

    return $recipe;
}

我的食谱模型具有以下带有getter的属性:

protected $userName = null;

public function setUserName($userName) {
    $this->userName = $userName;
}

有趣的是,当使用此代码snipet时,我还将整个User Object作为JSON字符串作为Recipe JSON字符串的一部分:

public function show($id) {
    recipe = Recipe::find($id);
    $recipe->user->name;

    return $recipe;
}

因此,在我的用户对象的调用中发生了一些神奇的事情,属于食谱。

2 个答案:

答案 0 :(得分:0)

我相信这是因为您访问了用户关系。默认情况下,Eloquent实现延迟加载,但是,当您访问用户关系以获取名称时,整个对象将被加载并附加到您的Recipe对象。

要隐藏json上的关系,您应该将属性添加到模型上的$ hidden属性

protected $hidden = ['user'];

答案 1 :(得分:0)

您必须将关系方法名称添加到$hidden模型中的Recipe属性数组中,以将其从json结果中删除。

https://laravel.com/docs/5.1/eloquent-serialization#hiding-attributes-from-json

class Recipe extends Model
{
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = ['user'];

    /**
     * The appended attributes shown in JSON results.
     *
     * @var array
     */
    protected $appends = ['username'];

    /**
     * The username attribute accessor for JSON results.
     *
     * @var string
     */
    public function getUsernameAttribute()
    {
        return $this->user->name;
    }
}

我不相信有一种方法可以动态执行此操作,除了形成自己的JSON结果集。

您还可以将$hidden属性添加到User模型中,以删除您想要从JSON结果隐藏的用户属性?这将允许您使用序列化关系模型而不返回敏感信息。