【问题标题】:Laravel - how to makeVisible an attribute in a Laravel relation?Laravel - 如何使 Laravel 关系中的属性可见?
【发布时间】:2017-10-25 08:24:06
【问题描述】:

我在我的模型代码中使用来获取关系

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',
    ];
    // ...
}

在某些情况下,我想使密码字段可见

我怎样才能做到这一点?

【问题讨论】:

    标签: laravel


    【解决方案1】:

    最高投票的答案似乎对我不起作用(relations 属性现在似乎是protected array 所以不能用作@DevK 答案中的集合),我改为使用:

    $parent->setRelation('child', $parent->child->first()->setVisible(['id']));
    

    【讨论】:

      【解决方案2】:

      嗯,我从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');
          }
      ...
      }
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我厌倦了这种方法,但找不到我必须写的内容才能从我的public function extensions() 返回带有可见密码的结果。如果我从该方法返回Model::get() Collection 而不是Illuminate\Database\Eloquent\Relations\BelongsToMany,它会破坏我的所有其他东西。您提议更改返回的关系数据的类型。这里laravel.com/docs/5.4/eloquent-relationships 它返回类似return $this->belongsTo('App\User'); 但不是return $this->belongsTo('App\User')->get();
        • 更新了我的答案。最后两个都是从关系中加载的。第一个假设你之前已经加载了你的关系,第二个假设你在旅途中加载它。
        • 我仍然不知道如何修改我的public function extensions() 以使密码字段可见。
        • 你不能。您不能使字段在查询中可见(关系返回查询,而不是模型),这一切都发生在模型上。
        猜你喜欢
        • 2021-01-21
        • 2015-01-26
        • 1970-01-01
        • 2021-12-10
        • 2020-06-10
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 2020-09-07
        相关资源
        最近更新 更多