为了保持我的编码风格的一致性,我想使用camelCase
来访问属性而不是snake_case
。这在Laravel中可能没有修改核心框架?如果是这样,怎么样?如何使用骆驼案例访问属性?
例子:
// Database column: first_name
echo $user->first_name; // Default Laravel behavior
echo $user->firstName; // Wanted behavior
为了保持我的编码风格的一致性,我想使用camelCase
来访问属性而不是snake_case
。这在Laravel中可能没有修改核心框架?如果是这样,怎么样?如何使用骆驼案例访问属性?
例子:
// Database column: first_name
echo $user->first_name; // Default Laravel behavior
echo $user->firstName; // Wanted behavior
创建自己的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
使用的魔术方法。
由于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);
}
}
你能解释一下你在这里解决的问题吗?我不是真的遵循你在关系数组上做的验证吗? – 2016-08-05 20:06:25
假设你运行查询“User :: with('likedPosts')',它将被存储为''user-> attributes ['likedPosts']''。然而,当你重载''getAttribute''并将所有内容都改成snake_case时,当你编写''user-> likedPosts''时,它会尝试访问''user-> attributes ['liked_posts']'',不存在。然后laravel会懒惰地加载关系,即使关系已经被加载(作为favoritePosts)。为了防止这种情况,“if”语句是必要的。 – 2016-08-07 11:48:07
哦,我现在明白了......非常感谢您的帮助! ;) – 2016-08-07 20:19:52
我敢肯定你已经看到http://laravelsnippets.com/ – 2014-08-29 00:54:37
你也不得不延长__isset()和__unset()方法。否则isset(),empty()和unset()函数将无法正确使用骆驼事件键。我在这个bug上花了半天的时间。 – jaaksarv 2015-11-17 16:01:30
寻找这个像地狱兄弟谢谢! :D – 2017-10-03 05:02:19