laravel默认不生成迁移文件,需加-m参数;表名非标准时须设$table和$primarykey;$fillable漏字段会导致赋值忽略,$casts错配引发类型错误;关联方法名、外键、主键不一致会导致with()失效。

php artisan make:model 生成模型时为什么没创建迁移文件
默认情况下 php artisan make:model 只生成模型类,不带迁移、控制器或工厂——这是 Laravel 的保守设计,避免误建冗余文件。
常见错误现象:运行 php artisan make:model User 后发现数据库表不存在,也没生成 create_users_table.php 迁移。
- 加
-m参数才同步生成迁移:php artisan make:model User -m - 想一次性配齐常用配套,用
-mfcr(迁移 + 工厂 + 控制器 + 资源路由) - 注意:如果表已存在且命名不标准(比如不是复数蛇形),后续模型查不到数据,得手动改
$table属性
模型里 $table 和 $primaryKey 怎么设才不踩坑
Laravel 模型默认按约定推导表名和主键,但实际项目中几乎总要干预——尤其对接旧库或使用非标命名。
使用场景:表名是 user_info,主键是 uid,且不是自增整型。
-
$table = 'user_info'必须显式声明,否则模型会去找users -
$primaryKey = 'uid'要写,否则 Eloquent 默认用id去查 - 如果主键不是自增整型(比如 UUID 或字符串),务必加
$incrementing = false - 若主键是字符串且长度超 255,还要配合
$keyType = 'string',不然find()可能静默失败
模型里用 protected $fillable 和 $casts 时的典型误用
$fillable 控制批量赋值白名单,$casts 管字段类型转换——这两个看似简单,但错配会导致数据写入异常或类型丢失。
常见错误现象:前端传来 "is_active": "1",存进数据库变成 0;或 json 字段取出来还是字符串不是数组。
-
$fillable = ['title', 'content']里漏了字段,create()或update()就直接忽略,不报错也不提示 -
$casts = ['is_active' => 'boolean']会让"1"、"true"、1都转成true,但数据库字段必须是 TINYINT(1) 或 BOOLEAN,否则存不进去 -
json字段必须用$casts = ['meta' => 'array'],且数据库类型得是JSON(MySQL 5.7+ / PG)或TEXT(低版本 fallback) - 别在
$casts里写不存在的字段名,Eloquent 不会警告,但取值时返回null
模型关联定义后为什么 with() 预加载没生效
写了 hasMany() 却发现 with('posts') 查出来还是 N+1,大概率是方法名、外键或本地键没对上 Laravel 的隐式约定。
使用场景:User 模型关联 posts 表,但 posts 表主键是 article_id,外键是 author_id。
- 关联方法名必须是名词单数/复数(如
posts()),不能叫getPosts()或userPosts() - 默认外键是
user_id,如果实际是author_id,得显式传参:return $this->hasMany(Post::class, 'author_id') - 如果
Post模型主键不是id,还得补第三个参数:return $this->hasMany(Post::class, 'author_id', 'article_id') - 预加载字段名(
with('posts'))必须和关联方法名完全一致,大小写敏感,不能写成with('Posts')
$table、$primaryKey、$casts 和关联方法的参数,比翻文档更快定位问题。











