Laravel属性访问者大写字母被忽略

时间:2015-10-10 22:17:14

标签: php laravel eloquent accessor lumen

我正在使用Lumen框架。我有一个问题,我需要为属性设置自定义访问器,但问题是数据库中的列以大写字母开头 例如Logo。如果是第一个大写字母,在检索对象时不调用访问者,我尝试过几个列,名称从小写字母开始的列完美地工作。

 public function getLogoAttribute($value) 

此访问器不起作用,因为列的名称为Logo
我无法更改数据库中列的名称,但需要在我的应用程序中使用访问器 我知道我可以更改Eloquent框架的来源,但也许还有其他方法可以让它发挥作用 谢谢。

2 个答案:

答案 0 :(得分:1)

我花了几个小时试图在网上找到答案,但我决定自己在代码中找到这个部分 我找到了。

它位于vendor/illuminate/database/Eloquent/Model
方法public function attributesToArray()

像这样修改此方法的部分

 $mutatedAttributes = $this->getMutatedAttributes();

        // We want to spin through all the mutated attributes for this model and call
        // the mutator for the attribute. We cache off every mutated attributes so
        // we don't have to constantly check on attributes that actually change.
        foreach ($mutatedAttributes as $key) {
            if (! array_key_exists($key, $attributes) ) {
                if(array_key_exists(ucfirst($key), $attributes)) {
                    $key = ucfirst($key);
                }
                else {
                    continue;
                }
            }

如果列名中有多个大写字母,则无效。

这个问题的解决方案很糟糕,只需根据惯例命名数据库列,您就不会遇到任何问题(我可以在我的情况下更改列名)。

<强>更新

您也可以像这样修改类

    /**
     * Indicates if the model mutated attributes can have different case from ex. User_comments instead of user_comments.
     *
     * @var bool
     */
    public $upperCaseMutatedAttributes = false;

 if($this->upperCaseMutatedAttributes && array_key_exists(ucfirst($key), $attributes)) {
                    $key = ucfirst($key);
                }

您可以在班级中覆盖此变量。

答案 1 :(得分:0)

我确实喜欢这样

SELECT DISTINCT City FROM Station
WHERE City LIKE '%a' 
OR City LIKE '%e'
OR City LIKE '%i'
OR City LIKE '%o'
OR City LIKE '%u';