我有两种模式:
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;
}
因此,在我的用户对象的调用中发生了一些神奇的事情,属于食谱。
答案 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结果隐藏的用户属性?这将允许您使用序列化关系模型而不返回敏感信息。