如何正确隐藏模型关系以防止返回 toArray() 或 toJson()?
Posted
技术标签:
【中文标题】如何正确隐藏模型关系以防止返回 toArray() 或 toJson()?【英文标题】:How do I correctly hide model relationships from returning in toArray() or toJson()? 【发布时间】:2020-01-13 23:32:25 【问题描述】:我目前正在编写一个 API 的项目,并且对于很多模型,我试图隐藏它们的父关系以防止返回,就像这样
<?php namespace Viper\Model;
class User_Token extends Eloquent
protected $table = 'users_tokens';
protected $fillable = array(
'user_id', 'token'
);
protected $hidden = array(
'id', 'user_id', 'user'
);
public function user()
return $this->belongsTo('User');
在 Laravel 文档中,对于 Eloquent > Converting to Array or Json 部分,它明确表示
注意:隐藏关系时,使用关系的方法名, 不是动态访问器名称。
这究竟是什么意思?在上面的示例中,方法名称和动态访问器名称都是相同的,我一辈子都想不出这种情况。
【问题讨论】:
【参考方案1】:protected $hidden = array(
'id', 'user_id', 'user'
^^^ relationship's method name which is "user"
);
如果你想隐藏关系,你必须在隐藏属性下包含method name
。从您的隐藏属性中,我可以看到,您完美地隐藏了 user
关系,以防止数组和 JSON 转换。但是,如果您的 users_tokens
表中有“用户”列,我不知道 Laravel 会做什么。
public function user()
return $this->belongsTo('User');
【讨论】:
我所有的方法和列名都是专门选择的,这样它们就不会冲突。我只是不明白方法名称和动态访问器名称之间的区别,因为访问器名称是从方法名称派生的...... 谢谢,这项工作非常适合我。所以如果我有 userPhone() 关系,laravel 会将 user_phone 放入 json。所以我不得不把'userPhone'放在$hidden数组而不是user_phone中。希望这对某人有所帮助。【参考方案2】:我遇到了同样的问题,并决定通过 PR 向 Laravel 文档澄清这一点。 似乎没有区别,而且那个注释是不正确的。
https://github.com/laravel/docs/pull/3351
【讨论】:
以上是关于如何正确隐藏模型关系以防止返回 toArray() 或 toJson()?的主要内容,如果未能解决你的问题,请参考以下文章
机器学习中的数据泄露是什么?构建模型中如何防止数据泄露?正确的方案是什么?如何使用pipeline防止数据泄露?
Laravel Eloquent ORM 无法正确返回模型的关系