Laravel - 如何使Laravel关系中的一个属性变为可见?

时间:2017-05-24 20:17:51

标签: laravel

我在我的模型代码中使用以获得关系

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 密码字段。

我怎样才能做到这一点?

4 个答案:

答案 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)

使用以下方法HiddentoArray()时,不会填充

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']));