Laravel5.5默认表名规则修改及A16模型表名报错解决
Laravel 5.5 模型表名疑问解答
1. 为什么默认生成表名是A16_s而非A16s?
这是Laravel内置字符串转换规则导致的:
- Laravel的
getTable()方法默认先通过class_basename($this)获取模型类名(这里是A16); - 接着用
Str::plural()生成复数形式,对于数字结尾的模型名,复数规则是直接追加s,得到A16s; - 最后通过
Str::snake()转换为蛇形命名,而Str::snake()会自动在数字与字母之间插入下划线,所以A16s会被转换成a16_s(你的报错显示A16_s可能是数据库大小写敏感或配置差异,但核心逻辑是数字和字母间的下划线插入)。
2. 为什么Laravel默认使用蛇形复数命名?
这个规则是Laravel遵循行业惯例设计的:
- 数据库命名规范:多数数据库(如MySQL)推荐使用蛇形命名(
snake_case)作为表名和字段名,可读性更强且符合数据库的命名习惯; - 代码风格区分:模型类名采用大驼峰(
PascalCase),表名用蛇形复数,能清晰区分代码层面的类和数据库层面的表; - 减少手动配置:对于大多数常规场景,这个自动转换规则能让开发者无需手动指定表名,提升开发效率。
3. 如何修改默认表名规则以符合个人习惯?
如果你想改成xxs这种直接追加s的形式,有两种方案:
方案一:全局修改(推荐)
创建一个自定义的基础模型类,让所有业务模型继承它,并重写getTable()方法:
// app/Models/BaseModel.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; class BaseModel extends Model { public function getTable() { if (! isset($this->table)) { // 直接使用类名的复数形式,不转换为蛇形 $this->table = Str::plural(class_basename($this)); } return $this->table; } }
然后让你的A16模型继承这个基础模型:
// app/Models/A16.php <?php namespace App\Models; class A16 extends BaseModel { // 无需再手动设置$table,默认会对应`A16s`表 }
方案二:单个模型局部修改
这就是你已经用到的方法,直接在模型中指定表名:
class A16 extends Model { protected $table = 'A16s'; }
内容的提问来源于stack exchange,提问作者robspin
相关产品推荐
相关产品推荐

