
本文详解 Laravel 中因数据库列名与模型/表单字段不一致导致的 Column not found: 1054 Unknown column 'category_name' 错误,通过统一字段命名(categorie_name)并验证填充规则、迁移结构与控制器逻辑,快速定位并修复问题。
本文详解 laravel 中因数据库列名与模型/表单字段不一致导致的 `column not found: 1054 unknown column 'category_name'` 错误,通过统一字段命名(`categorie_name`)并验证填充规则、迁移结构与控制器逻辑,快速定位并修复问题。
该错误的核心原因在于 数据库表结构、Eloquent 模型可填充字段($fillable)与表单提交字段三者之间的命名不一致,导致 Laravel 尝试向不存在的列 category_name 插入数据,而实际数据库中定义的列为 categorie_name。
从你提供的迁移文件可见:
// migrations/..._create_categories_table.php
$table->string('categorie_name'); // ← 实际列名是 'categorie_name'
但模型 Categorie.php 中却声明:
protected $fillable = ['category_name']; // ❌ 错误:与数据库列名不匹配
同时,表单中 <input name="category_name"> 提交的也是 category_name,而控制器直接使用 $request->validate(['category_name' => ...]) 并传给 Categorie::create() —— 此时 Eloquent 会尝试将 category_name 值写入数据库中名为 category_name 的列,但该列并不存在,因此抛出 SQLSTATE[42S22] 异常。
✅ 正确做法是三端统一为 categorie_name(注意拼写:categorie 而非 category,这与你的法语上下文和迁移一致):
-
更新模型
app/Models/Categorie.php:protected $fillable = ['categorie_name']; // ✅ 与迁移列名完全一致
-
同步更新表单字段名(Blade):
<input id="cemail" class="form-control" type="text" name="categorie_name"><!-- ✅ 改为 'categorie_name' -->
-
更新控制器验证规则(
CategorieController.php):$validatedData = $request->validate([ 'categorie_name' => 'required|string|max:255', // ✅ 字段名同步变更 ]); $categorie = Categorie::create($validatedData);
⚠️ 注意事项:
- Laravel 默认使用
snake_case列名,且 Eloquent 不会自动转换下划线命名差异(如category_name≠categorie_name),必须严格一致; - 若已运行过迁移,修改列名需新建迁移重命名字段(
php artisan make:migration rename_category_name_to_categorie_name_in_categories_table),或手动在数据库中执行ALTER TABLE categories CHANGE category_name categorie_name VARCHAR(255)(生产环境慎用); - 建议在模型中显式指定表名和主键(增强可读性):
protected $table = 'categories'; protected $primaryKey = 'id';
修复后,请求流程即为:表单提交 categorie_name → 控制器验证并创建数组 → Eloquent 将其映射至数据库 categorie_name 列 → 插入成功。整个过程字段命名零偏差,彻底消除列未找到异常。











