我在我的模型代码中使用以获得关系
class User extends Authenticatable
{
...
public function extensions()
{
return $this->belongsToMany(Extension::class, 'v_extension_users', 'user_uuid', 'extension_uuid');
}
...
}
扩展程序隐藏字段密码。
class Extension extends Model
{
...
protected $hidden = [
'password',
];
...
}
在某些情况下,我想 makeVisible 密码字段。
我怎样才能做到这一点?
答案 0 :(得分:5)
->makeVisible([...])
应该有效:
$model = \Model::first();
$model->makeVisible(['password']);
$models = \Model::get();
$models = $models->each(function ($i, $k) {
$i->makeVisible(['password']);
});
// belongs to many / has many
$related = $parent->relation->each(function ($i, $k) {
$i->makeVisible(['password']);
});
// belongs to many / has many - with loading
$related = $parent->relation()->get()->each(function ($i, $k) {
$i->makeVisible(['password']);
});
答案 1 :(得分:1)
好吧,我从https://stackoverflow.com/a/38297876/518704
得到了这个想法由于我的关系模型Extension::class
在我的代码return $this->belongsToMany(Extension::class,...
中按名称调用,我甚至无法将参数传递给它的构造函数。
因此,为了将某些东西传递给构造函数,我可以使用静态类变量。
所以在我的Extension
模型中,我添加静态变量并运行makeVisible方法。
稍后我会破坏变量以确保下一次调用和实例使用默认模型设置。
我把它移到了一个特性,但在这里我展示了我的模型示例。
class Extension extends Model
{
public static $staticMakeVisible;
public function __construct($attributes = array())
{
parent::__construct($attributes);
if (isset(self::$staticMakeVisible)){
$this->makeVisible(self::$staticMakeVisible);
}
}
.....
public function __destruct()
{
self::$staticMakeVisible = null;
}
}
在我的关系中,我使用类似的东西
class User extends Authenticatable
{
...
public function extensions()
{
$class = Extension::class;
$class::$staticMakeVisible = ['password'];
return $this->belongsToMany(Extension::class, 'v_extension_users', 'user_uuid', 'extension_uuid');
}
...
}
答案 2 :(得分:0)
Hidden
或toArray()
时,不会填充 toJson()
个字段。试试dd($extension->toJson());
但是,如果明确使用该字段仍然可用:
$extension->password;
此处有更多信息:https://laravel.com/docs/5.4/eloquent-serialization#hiding-attributes-from-json
答案 3 :(得分:0)
获得最高投票的答案似乎并不适合我(relations
属性现在似乎是protected array,因此不能用作@DevK答案中的集合),我改为已使用:
$parent->setRelation('child', $parent->child->first()->setVisible(['id']));