Laravel - 数据库、表和列的命名规范?

28

我正在使用Laravel Eloquent数据对象访问我的数据,那么最好的命名方式是什么,包括表名、列名以及外键/主键等?

我发现有很多命名约定,我只是想知道哪一个最适合Laravel Eloquent模型。

我考虑遵循以下命名约定:

  1. 单数表名(例如:Post)
  2. 单数列名(例如:userId - 帖子表中的用户ID)
  3. 驼峰式命名法为表名中的多个单词使用驼峰式命名法(例如:PostComment、PostReview、PostPhoto)
  4. 驼峰式命名法为列名中的多个单词使用驼峰式命名法(例如:firstName、postCategoryId、postPhotoId)

这样,我可以在控制器中使用类似的语法。

$result = Post::where('postCategoryId', '4')->get();

有没有关于这个的推荐 Laravel 指南?我能否按照这些命名约定进行下去?

如果有更好的建议,请告诉我,非常感谢!


1
你可以根据需要使用它们,但问题在于你必须正确定义它们,以便在关系情况下自动使用。 - Sougata Bose
4个回答

36

Laravel有它自己的命名规则。例如,如果你的模型名称为User.php,那么Laravel期望在该文件内有一个名为'User'的类。它还期望User模型对应着users表。不过,你可以通过在你的模型上定义一个 table 属性来覆盖这个约定,如下所示:

    class User extends Eloquent implements UserInterface, RemindableInterface {
        protected $table = 'user';
    }

根据 Laravel 官方文档:

请注意,我们没有告诉 Eloquent 使用哪个表来存储 User 模型的数据。 除非另外指定了表名,否则类名的小写复数形式将用作表名。 因此,在本例中,Eloquent 将假定 User 模型将记录存储在 users 表中。您可以通过在模型上定义 $table 属性来指定自定义表。

如果你要在另一张表中使用 user 表的 id 作为外键,那么它应该是蛇形格式,如 user_id,以便在关系情况下自动使用。同时,你也可以通过在关系函数中指定额外参数来覆盖这个约定。例如:

    class User extends Eloquent implements UserInterface, RemindableInterface {
        public function post(){
            return $this->hasMany('Post', 'userId', 'id');
        }
    }

    class Post extends Eloquent{
        public function user(){
            return $this->belongsTo('User', 'userId', 'id');
        }   
    }

Laravel Eloquent关联关系文档

对于表中的其他列,您可以根据喜好进行命名。

我建议您阅读文档一次。


您的hasMany示例是错误的——键应该被替换(第二个参数为fk,第三个参数为pk)。 - Jarek Tkaczyk
关于表名city,应该是citys还是cities?我猜测需要明确。 - Abdul Rehman

6

我不太同意你们在这里展示的例子。

如果您查看官方Laravel文档,特别是Eloquent关系部分(http://laravel.com/docs/4.2/eloquent#relationships),就会发现很清晰。

表名应该是复数形式,例如User模型的'users'表。

列名不需要采用驼峰命名法,而是蛇形命名法。如下面链接所示:Database/model field-name convention in Laravel?

通常情况下,您可以看到像RedBeanORM一样使用蛇形列名,即使您尝试其他方式也是如此。建议避免重复表名和列名,因为您可以从模型对象调用方法来访问它们的关系。


0
    class User extends Eloquent implements UserInterface, RemindableInterface {
        public function post(){
            return $this->hasMany('Post');
        }
    }

    class Post extends Eloquent{
        public function user(){
            return $this->belongsTo('User');
        }   
    }

-2

默认的表命名约定很容易与安装多个包时发生冲突,这些包可能偶然具有相同的类名。解决方案是将表命名为:[vendor]。[package]。[class],这符合Laravel中命名空间的应用方式。

编辑:虽然在表名中使用点不被推荐。是否有其他替代约定可用以确保模块化构建应用程序的开发人员无需担心现有的表名。


将表命名为:.. ?你为什么要这样做? - m02ph3u5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接