【问题标题】:Laravel - Database, Table and Column Naming Conventions?Laravel - 数据库、表和列命名约定?
【发布时间】:2014-11-13 16:21:18
【问题描述】:

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

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

我正在考虑以下命名约定:

  1. 单数表名(例如:Post)
  2. 单列名称(例如:userId - post 表中的用户 ID)
  3. 表名中多个单词的驼峰式大小写(例如:PostComment、PostReview、PostPhoto)
  4. 列名中多个单词的驼峰式大小写(例如:firstName、postCategoryId、postPhotoId)

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

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

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

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

【问题讨论】:

  • 您可以根据需要使用它们。但问题是你已经正确定义了它们,以便在关系的情况下自动使用。

标签: php database laravel naming-conventions eloquent


【解决方案1】:

Laravel 有自己的命名约定。例如,如果你的模型名称是 User.php,那么 Laravel 期望类 'User' 在该文件中。它还期望users 表用于User 模型。但是,您可以通过在模型上定义表属性来覆盖此约定,例如,

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

来自 Laravel 官方文档:

请注意,我们没有告诉 Eloquent 将哪个表用于我们的 User 模型。 类的小写复数名称将用作表名 除非明确指定另一个名称。所以,在这种情况下,Eloquent 将假定 User 模型将记录存储在 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

对于表格中的其他列,您可以随意命名。

我建议你看一遍文档。

【讨论】:

  • 您的 hasMany 示例错误 - 应替换键(fk 作为第二个参数,pk 作为第三个)。
  • 表名city 呢?应该是城市还是城市?我猜是明确的。
【解决方案2】:

我一般不同意你们在这里展示的这些例子。

如果你看一下官方 Laravel 文档就很清楚了,尤其是在 Eloquent 的关系会话中 (http://laravel.com/docs/4.2/eloquent#relationships)。

表名应该是复数形式,即用户模型的“用户”表。

而且列名不必是驼峰式,而是蛇式。看到已经回答了:Database/model field-name convention in Laravel?

这太常见了,您可以看到它就像 RedBeanORM:列的 Snake Case,即使您尝试其他的也是如此。并且由于您可以从 Model 对象调用的方法来访问它们的关系,因此建议避免将表名与列名重复。

【讨论】:

    【解决方案3】:

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

    已编辑:但不建议在表名中使用点。是否可以使用替代约定来确保模块化构建应用程序的开发人员无需担心现有的表名。

    【讨论】:

    • "将表命名为:.." ?你为什么要这样做?
    【解决方案4】:
        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');
            }   
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多