繁体   English   中英

Laravel 忽略修改器

[英]Laravel ignore mutators

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

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

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

在模型中设置一个公共变量,例如 $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);
    }
}

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

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

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

$service->getOriginal('amount')

请参阅此帖子: getOriginal() 示例

Api: API 文档

如果您需要偶尔跳过 Eloquent Model mutators(例如在单元测试中),您应该使用setRawAttributes()

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

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

$model->getRawOriginal('first_name')

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

如果您只需要偶尔忽略修改器 - 创建另一个不经过默认修改的设置器:

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

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

我在使用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)

这个对我有用 :

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM