Laravel 中生成模型后需手动配置 $table、$fillable 等关键属性,否则 Article::create() 会因 MassAssignmentException 静默失败;推荐用 php artisan make:model Article -m 一步生成模型与迁移,并执行 migrate 建表、检查数据库连接及命名空间自动注册。

php artisan make:model 就能生成可用的模型类,但光有文件远远不够——不配表名、不设可批量赋值字段、不确认数据库连接,后续 Article::create() 会静默失败或报错 MassAssignmentException。
怎么用 Artisan 快速生成模型和迁移文件
最常用也最推荐的是一步到位生成模型 + 迁移文件:
-
php artisan make:model Article -m:在app/Models/下建Article.php,同时在database/migrations/下生成带--create=articles的迁移文件 -
php artisan make:model Models/Post -m:带命名空间子目录时,Artisan 会自动处理命名空间声明(如namespace App\Models;) - 如果没加
-m,后续要手动建迁移:php artisan make:migration create_articles_table --create=articles
模型里必须检查的几个关键属性
生成的模型默认继承 Illuminate\Database\Eloquent\Model,但以下属性几乎每次都要手动补全或核对:
-
$table:Laravel 默认用模型名复数(articles),但如果实际表名是blog_posts,必须显式写protected $table = 'blog_posts'; -
$fillable:不设这个,Article::create([...])会抛MassAssignmentException;建议只列真正允许用户提交的字段,比如['title', 'content'],别把status或user_id直接放进去 -
$guarded和$fillable互斥,选一个用就行;新手建议优先用$fillable,更明确 -
$primaryKey:主键不是id?比如是article_uuid,就得写protected $primaryKey = 'article_uuid'; -
$timestamps:如果表里没有created_at/updated_at字段,一定设为false,否则save()会尝试写空值导致 MySQL 报错
为什么模型创建后还查不到数据?常见连带问题
模型文件写好了,Article::all() 却返回空数组或报错,大概率卡在这几个环节:
- 数据库没连上:检查
.env里的DB_DATABASE是否存在,DB_USERNAME/DB_PASSWORD是否正确;改完.env后执行php artisan config:clear(缓存过配置的话) - 表还没建:运行
php artisan migrate前,确保迁移文件里的up()方法已定义好字段,比如漏了$table->string('title');,迁移就只是建了个空表 - 模型路径没注册:如果模型不在
app/Models/而是自建目录(如app/Entities/),需确认composer.json的"autoload": {"psr-4": {...}}已包含该命名空间,并运行composer dump-autoload - MySQL 严格模式干扰:某些字段类型(如
text)在严格模式下插入空字符串会失败,可在迁移中加->nullable()或在config/database.php的 MySQL 配置里临时关掉strict
$table 名或漏写一个 $fillable 字段,都会让后续所有 CRUD 操作在无声中失效——这点比语法错误更难排查。


















