修改Laravel模型的所有属性

时间:2015-11-28 21:44:11

标签: laravel laravel-5.1

访问者将完美地在单个属性上完成工作,但我需要一种方法来自动为所有属性执行Accessor / Getter作业。

目的是我想在获取属性时替换一些字符/数字,然后将它们打印出来。我可以在控制器内手动完成,但我认为从模型端自动获取它会很棒。

与覆盖getAttributes()方法一样:

public function getAttributes()
{
    foreach ($this->attributes as $key => $value) {
        $this->attributes[$key] = str_replace([...], [...], $value);
    }
    return $this->attributes;
}

但我每次都要在模型$model->getAttributes();

上调用它

任何方法自动完成并干燥?

3 个答案:

答案 0 :(得分:5)

尝试类似:

public function getAttribute($key)
{
    if (array_key_exists($key, $this->attributes) || $this->hasGetMutator($key)) {
        if($key === 'name') return 'modify this value';
        return $this->getAttributeValue($key);
    }

    return $this->getRelationValue($key);
}

它完全覆盖默认方法,所以要小心一点。

修改

另请查看:http://laravel.com/docs/5.1/eloquent-mutators

答案 1 :(得分:1)

我会采用以下方法并覆盖模型__get方法:

public function __get($key)
{
    $excluded = [
        // here you should add primary or foreign keys and other values,
        // that should not be touched.
        // $alternatively define an $included array to whitelist values
        'foreignkey', 
    ];

    // if mutator is defined for an attribute it has precedence.
    if(array_key_exists($key, $this->attributes)
       && ! $this->hasGetMutator($key) && ! in_array($key, $excluded))  {
        return "modified string";
    }

    // let everything else handle the Model class itself
    return parent::__get($key);
}

}

答案 2 :(得分:0)

如何使用每个创建和更新事件运行它。所以你可以这样做:

public function boot()
    {
        Model::creating(function ($model)
            return $model->getAttributes();   //or $this->getAttributes()
        });
        Model::updating(function ($model)
            return $model->getAttributes();   //or $this->getAttributes()
        });
    }