直接用 php artisan make:model 生成的模型类通常无法立即用于 article::create() 或 article::all(),因缺少 $table、$fillable 配置及数据库连接确认,易致静默失败或 massassignmentexception;推荐使用 php artisan make:model -m 一次性生成模型与迁移,减少手动对齐错误。

直接用 php artisan make:model 生成的模型类,90% 的情况下不能立刻用于 Article::create() 或 Article::all()——不配 $table、不设 $fillable、不确认数据库连接,就会静默失败或报 MassAssignmentException。
php artisan make:model -m 为什么是首选命令
它把模型和迁移文件一次性生成,避免后续手动补迁移、再改命名空间、再对齐表名的重复劳动。生成后你只需检查两件事:迁移里字段是否写全(比如漏了 $table->string('title'),migrate 就建了个空表),以及模型是否在 app/Models/ 下且被 PSR-4 自动加载。
常见错误:
- 只跑
php artisan make:model Article,没加-m,结果表根本不存在,Article::all()返回空数组也不报错 - 用
php artisan make:model Models/Post -m,但composer.json没更新"App\Models\": "app/Models/",导致类找不到 - 执行完
migrate后忘了php artisan config:clear,.env里改了DB_DATABASE却连错库
$fillable 不填就别想 create() 成功
Article::create(['title' => 'xxx']) 看似简单,但只要模型没定义 $fillable,Eloquent 就会直接丢弃所有字段,不报错、不提示、数据也不进库——这是最常被卡住几小时的静默坑。
实操建议:
- 只列真正允许用户提交的字段,比如
protected $fillable = ['title', 'content'];别把status、user_id、is_published直接塞进去 - 不要同时设
$fillable和$guarded,它们互斥;新手一律用$fillable - 字段名拼错(如
'is_active'写成'isactive')不会触发警告,赋值时直接消失,调试时可打印$article->getAttributes()对比
$table、$primaryKey、$timestamps 必须按真实表结构硬写
Laravel 默认按类名推导:User → users 表、主键 id、时间戳字段 created_at/updated_at。但现实里几乎全是例外。
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
必须核对并显式声明:
-
protected $table = 'blog_posts'—— 写成$tableName或$table_name都无效 -
protected $primaryKey = 'article_uuid'—— 主键不是id时,Article::find(1)会查SELECT * FROM blog_posts WHERE id = 1,字段不存在就返回 null -
public $timestamps = false—— 如果表里没有created_at字段,不关掉这个,save()会尝试插入 NULL 到不存在的字段,MySQL 报错
注意:$timestamps = false 只是关自动维护,不阻止你手动写入;如果表里实际用的是 create_time,得自己在 creating 事件里赋值。
关联创建别手动塞外键,用关系方法链式调用
要为用户创建文章,别写 Post::create(['user_id' => $user->id, 'body' => 'xxx'])。正确做法是走已定义的关联:
$post = $user->posts()->create(['body' => 'xxx']);
这样做的好处:
- 外键
user_id自动填入,不用手抖写错字段名或取错值 - 如果
posts()关系里指定了自定义外键(比如belongsTo(User::class, 'author_id')),链式调用会自动匹配,手动写就容易对不上 - 中间表关联(如
belongsToMany)更明显:用$user->roles()->attach($roleId),而不是自己去操作user_role表
最容易被忽略的一点:关系方法必须先在模型里正确定义,且外键字段名、本地键、中间表名全部和数据库真实结构一致——差一个字母,with('posts') 就返回空集合,还查不出错在哪。










