2014-08-28 54 views
13

为了保持我的编码风格的一致性,我想使用camelCase来访问属性而不是snake_case。这在Laravel中可能没有修改核心框架?如果是这样,怎么样?如何使用骆驼案例访问属性?

例子:

// Database column: first_name 

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

回答

15

创建自己的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使用的魔术方法。

+2

我敢肯定你已经看到http://laravelsnippets.com/ – 2014-08-29 00:54:37

+4

你也不得不延长__isset()和__unset()方法。否则isset(),empty()和unset()函数将无法正确使用骆驼事件键。我在这个bug上花了半天的时间。 – jaaksarv 2015-11-17 16:01:30

+0

寻找这个像地狱兄弟谢谢! :D – 2017-10-03 05:02:19

10

由于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); 
    } 
} 
+0

你能解释一下你在这里解决的问题吗?我不是真的遵循你在关系数组上做的验证吗? – 2016-08-05 20:06:25

+2

假设你运行查询“User :: with('likedPosts')',它将被存储为''user-> attributes ['likedPosts']''。然而,当你重载''getAttribute''并将所有内容都改成snake_case时,当你编写''user-> likedPosts''时,它会尝试访问''user-> attributes ['liked_posts']'',不存在。然后laravel会懒惰地加载关系,即使关系已经被加载(作为favoritePosts)。为了防止这种情况,“if”语句是必要的。 – 2016-08-07 11:48:07

+0

哦,我现在明白了......非常感谢您的帮助! ;) – 2016-08-07 20:19:52