之前一直用Spring+Mybatis做WEB开发,由于公司的需要开始接触Laravel框架。不可否认确实被它所吸引,使用起来太优雅了。在这里不是说SSM这套解决方案不好,每个东西都有它存在的价值。Laravel使用起来这么优雅的原因我认为最大的原因是:约定优于配置。
切入正题,使用规范的好处是让你编码更加清晰。
数据库命名
- 建议使用复数名词作为表名,例如 users。
- 多对多关系中中间表用单数作为表名,例如 article_image。
- 数据库以及表名使用均使用小写英文字母,单词之间采用下划线为分割符,例如article_user。
- 不要使用关键字作为数据库或表的名字,例如null,select等等。
文件命名
Migrate
采用:动词 + _Table Name + _table,例如
- create_users_table
- alert_users_table
- 保持上面的Table Name与迁移文件中的表名一致
//2017_11_08_155329_create_articles_table.php的文件部分内容如下:
Schema::create('articles', function (Blueprint $table) {
//注意actions是一样的
});
Model
- 一律使用单数,例如 user,article
Seeder
- ModelName + TableSeeder,例如:UserTableSeeder
resources目录下文件
- resource下所有目录命名一律小写,单字间以下划线 “_” 分割.
方法
- Model中方法体的命名规则
在一对多与一对一等关联关系中是需要通过外键来建立业务关系的:
情况一:
class Post extends Model
{
/**
* 获得此博客文章的评论。
*/
public function comments()
{
return $this->hasMany('App\Comment');
}
}
Eloquent 会自动确定 Comment 模型上正确的外键字段。按照约定,Eloquent 使用父级模型名的「snake case」形式、加上 _id 后缀名作为外键字段。对应到上面的场景,就是 Eloquent 假定 Comment 模型对应到 Post 模型上的那个外键字段是 post_id。这里再次强调模型名(Model)最好用单数形式。
情况二:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
/**
* 获得此评论所属的文章。
*/
public function post()
{
return $this->belongsTo('App\Post');
}
}
在上面的例子中,Eloquent 会尝试用 Comment 模型的 post_id 与 Post 模型的 id 进行匹配。默认外键名是 Eloquent 依据方法名、并在方法名后加上 _id (也就是这里的方法名加上_id)后缀确定的。如果您的数据库没有做到上面的约束,请将相关的列添加上。虽然是可选参数,但是我的建议是最好把参数都写上。这样逻辑更加清晰,不易犯错。
情况三:
如果您没有给Model指定对应的数据库表,那么它默认会用类的【蛇形名称】,复数名称来作为数据表的名称,例如下面的例子中Eloquent 将会假设 Video模型被存储记录在 videos 数据表中,但是你可以在模型上定义一个 table 属性,用来指定自定义的数据表名称”my_videos”,建议加上$table属性:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Video extends Model
{
/**
* 与模型关联的数据表
*
* @var string
*/
protected $table = 'my_videos';
}
情况四:
多态关联中类型字段值最好自定义。
默认,Laravel 会使用完全限定类名作为关联模型保存在多态模型上的类型字段值。比如,在上面的例子中,Comment 属于 Post 或者 Video,那么 commentable_type的默认值对应地就是 App\Post 和 App\Video。但是,您可能希望将数据库与程序内部结构解耦。那样的话,你可以定义一个「多态映射表」来指示 Eloquent 使用每个模型自定义类型字段名而不是类名:
use Illuminate\Database\Eloquent\Relations\Relation;
Relation::morphMap([
'posts' => 'App\Post',
'videos' => 'App\Video',
]);
您可以在 AppServiceProvider 中的 boot 函数中使用 Relation::morphMap 方法注册「多态映射表」,或者使用一个独立的服务提供者注册。