【问题标题】:Laravel ignore mutatorsLaravel 忽略变异器
【发布时间】:2017-10-06 02:35:43
【问题描述】:

我正在使用 Laravel 的 Mutator 功能,并且我有以下 Mutator:

public function setFirstNameAttribute($value)
{
    $this->attributes['first_name'] = strtolower($value);
}

但是在某些情况下我需要忽略这个 Mutator。 有什么办法可以做到这一点

【问题讨论】:

  • 如果这个功能并不总是需要,那么肯定应该把它移到需要它的功能上并移除mutator?!

标签: php laravel laravel-5


【解决方案1】:

它对我有用:

$obj->getAttributes()['first_name']

【讨论】:

    【解决方案2】:

    我在使用setRawAttributes时遇到了一些问题,所以我决定使用这种方法

        public function setPasswordAttribute($value, $ignore = false)
        {
            if ($ignore)
                $this->attributes['password'] = $value;
            else
                $this->attributes['password'] = Hash::make($value);
        }
    

    当你想忽略 mutator 时,你可以使用 $user->setPasswordAttribute('123', true)

    【讨论】:

      【解决方案3】:

      如果您只是偶尔需要忽略 mutators - 创建另一个不经过默认突变的 setter:

      public function ignoreFirstNameMutator($value) {
          $this->attributes['first_name'] = $value;
      }
      

      $object->ignoreFirstNameMutator('Peter') //saves 'Peter'
      

      【讨论】:

        【解决方案4】:

        OP 真正想要的是来自数据库的原始值,它不通过给定的 mutator,每个人都建议 $model->getOriginal() 但是当你运行这个方法时,值仍然通过 mutator。所以真正的答案是

        $model->getRawOriginal('first_name')
        

        这将为您提供跳过 mutator 的原始值。 Laravel API: getRawOriginal

        【讨论】:

        • 实际上 OP 真正想要的是在数据库中 set 一个值,而不是 get。它们在 mutator 之后,而不是在 accessor 之后。这个答案(以及这里的其他一些答案)混淆了这一点,不回答这个问题。
        【解决方案5】:

        如果您需要偶尔跳过 Eloquent 模型修改器(例如在单元测试中),您应该使用 setRawAttributes()

        $model->setRawAttributes([
          'first_name' => 'Foobar',
        ]);
        

        【讨论】:

          【解决方案6】:

          虽然提供的答案似乎有效,但 Laravel 中有一种方法可以访问原始值:

          $service->getOriginal('amount')
          

          看到这个帖子: Example of getOriginal()

          API: API Documentation

          【讨论】:

          • 我认为 OP 的问题是如何设置原始属性,这并不能回答问题。
          • 如果代码正在处理表单保存请求,这将检索加载到表单中的旧值,而不是新的当前值。
          • 正如@Voyowsky 指出的那样,这忽略了属性的accessor(仅在Laravel mutator,这不是OP 要求的。它也没有获取当前属性的值,它获取属性的原始值(可能是 DB 的值),因此得名。在 Laravel 8 中,getOriginal() 被重命名为 getOriginalRaw() 并且 getOriginal() 将使用访问器,因为它应该。同样,这根本不是仅获取原始值的正确方法。 TL; DR:这个答案是错误的。也误导了读者。 original != raw
          【解决方案7】:

          在模型中设置一个公共变量,例如 $preventAttrSet

          public $preventAttrSet = false;
          
          public function setFirstNameAttribute($value) {
              if ($this->preventAttrSet) {
                  // Ignore Mutator
                  $this->attributes['first_name'] = $value;
              } else {
                  $this->attributes['first_name'] = strtolower($value);
              }
          }
          

          现在您可以根据自己的情况在需要忽略 Mutator 时将公共变量设置为 true

          $user = new User;
          $user->preventAttrSet = true;
          $user->first_name = 'Sally';
          echo $user->first_name;
          

          【讨论】:

          • 这不适用于查询生成器,它重置为第一个状态:(
          • 没关系它现在可以工作link
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-16
          • 1970-01-01
          • 2017-01-30
          • 1970-01-01
          • 2021-08-05
          • 1970-01-01
          相关资源
          最近更新 更多