为了与我的编码风格保持一致,我希望使用camelCase
来访问属性而不是snake_case
。在没有修改核心框架的情况下,Laravel可以实现这一点吗?如果是这样,怎么样?
示例:
// Database column: first_name
echo $user->first_name; // Default Laravel behavior
echo $user->firstName; // Wanted behavior
答案 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);
}
}