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

Gru*_*ruz 4 laravel

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

class User extends Authenticatable
{
...
    public function extensions()
    {
        return $this->belongsToMany(Extension::class, 'v_extension_users', 'user_uuid', 'extension_uuid');
    }
...
}
Run Code Online (Sandbox Code Playgroud)

扩展名具有现场密码隐藏.

class Extension extends Model
{
...
    protected $hidden = [
        'password',
    ];
...
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,我想makeVisible密码字段.

我怎样才能做到这一点?

Dev*_*evK 7

->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']);
});
Run Code Online (Sandbox Code Playgroud)


Gru*_*ruz 2

好吧,我从/sf/answers/2680851351/得到了这个想法

由于我的关系模型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;
    }

}
Run Code Online (Sandbox Code Playgroud)

在我的关系中我使用这样的东西

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');
    }
...
}
Run Code Online (Sandbox Code Playgroud)