如何使用驼峰式案例访问属性?

时间:2014-08-28 23:31:35

标签: laravel eloquent naming-conventions

为了与我的编码风格保持一致,我希望使用camelCase来访问属性而不是snake_case。在没有修改核心框架的情况下,Laravel可以实现这一点吗?如果是这样,怎么样?

示例:

// Database column: first_name

echo $user->first_name; // Default Laravel behavior
echo $user->firstName; // Wanted behavior

3 个答案:

答案 0 :(得分:20)

创建您自己的BaseModel类并覆盖以下方法。确保您的所有其他模型extend成为BaseModel

class BaseModel extends Eloquent {

    // Allow for camelCased attribute access

    public function getAttribute($key)
    {
        return parent::getAttribute(snake_case($key));
    }

    public function setAttribute($key, $value)
    {
        return parent::setAttribute(snake_case($key), $value);
    }

}

然后用于:

// Database column: first_name

echo $user->first_name; // Still works
echo $user->firstName; // Works too!

这个技巧围绕着通过覆盖Model中使用的魔法来强制关键到蛇案。

答案 1 :(得分:15)

由于SO不允许在评论中粘贴代码段,我将其作为新答案发布。

为了确保急切加载不会破坏,我不得不修改@ Lazlo的答案。当通过不同的密钥访问急切加载的关系时,它们会被重新加载。

<?php

class BaseModel extends Eloquent
{

    public function getAttribute($key)
    {
        if (array_key_exists($key, $this->relations)) {
            return parent::getAttribute($key);
        } else {
            return parent::getAttribute(snake_case($key));
        }
    }

    public function setAttribute($key, $value)
    {
        return parent::setAttribute(snake_case($key), $value);
    }
}

答案 2 :(得分:1)

以为我会发布此邮件,以防它对其他人有帮助。尽管Bouke的条目很棒,但它不能解决使用驼峰式名称的延迟加载关系。发生这种情况时,我们只需要检查方法名称以及其他检查即可。以下是我所做的:

class BaseModel extends Eloquent
{

    public function getAttribute($key)
    {

        if (array_key_exists($key, $this->relations)
          || method_exists($this, $key)
        )
        {
            return parent::getAttribute($key);
        }
        else
        {
            return parent::getAttribute(snake_case($key));
        }
    }

    public function setAttribute($key, $value)
    {
        return parent::setAttribute(snake_case($key), $value);
    }
}