Laravel - 数据库,表和列命名约定?

时间:2014-09-19 06:31:41

标签: php database laravel naming-conventions eloquent

我正在使用laravel eloquent数据对象来访问我的数据,命名我的表,列,外键/主键等的最佳方法是什么?

我发现,那里有很多命名约定。我只是想知道哪一个最适合laravel雄辩的模型。

我正在考虑遵循命名惯例:

  1. 奇异的表名(例如:帖子)
  2. 奇异列名称(例如:userId - 帖子表中的用户ID)
  3. 表名中多个单词的Camel大小写(例如:PostComment,PostReview,PostPhoto)
  4. 列名称中多个单词的Camel大小写(例如:firstName,postCategoryId,postPhotoId)
  5. 因此,我可以在控制器中使用类似的语法。

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

    是否有任何推荐的Laravel指南?我可以继续这些命名约定吗?

    如果有人有更好的建议,我会很高兴听到他们的消息。非常感谢!

4 个答案:

答案 0 :(得分:32)

Laravel拥有自己的命名惯例。例如,如果您的模型名称为User.php,那么Laravel期望上课' User'在那个文件里面。它还期望users模型的User表。但是,您可以通过在模型上定义表属性来覆盖此约定,例如

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

来自Laravel官方文档:

  

请注意,我们没有告诉Eloquent我们的用户模型使用哪个表。       该类的小写复数名称将用作表名       除非明确指定其他名称。所以,在这种情况下,Eloquent       将假设用户模型将记录存储在users表中。你可以指定一个       通过在模型上定义$table属性来定制表

如果你将另一个表中的用户表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');
        }   
    }

Docs for Laravel eloquent relationship

对于表格中的其他列,您可以根据需要为其命名。

我建议您查看一次文档。

答案 1 :(得分:6)

我不同意这些你在这里展示过的例子。

如果您查看官方的Laravel文档,特别是在Eloquent的关系会话(http://laravel.com/docs/4.2/eloquent#relationships)中,它会很干净。

表名应为复数,即'用户'用户模型表。

列名并不需要在Camel Case中,但是Snake Case。看到它已经回答:Database/model field-name convention in Laravel?

很常见,你可以看到它就像RedBeanORM:列的Snake Case,即使你尝试了其他的。由于您可以从Model对象调用以访问其关系的方法,建议避免使用列1重复表名。

答案 2 :(得分: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');
        }   
    }

答案 3 :(得分:-1)

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

已修改:建议不要在表名中使用点。是否有一个替代约定用于确保模块化构建应用程序的开发人员不需要担心现有的表名。