thinkphp6存文章数据不丢字段需确保模型$fillable包含title、content等字段,db::insert()字段名须与数据库列名完全一致,富文本字段用text类型,封面路径存相对路径并拼接根目录。

文章数据怎么存进数据库才不丢字段
ThinkPHP6 默认的 Db::insert() 或模型 save() 会忽略未定义在 $fillable 中的字段,哪怕表里存在、前端传了,也直接过滤掉——这是发布失败最常见原因。
实操建议:
- 检查模型类中的
$fillable数组,确保包含'title'、'content'、'category_id'、'status'等实际需要写入的字段 - 如果用
Db::insert()而非模型,字段名必须和数据库列名完全一致,且不能传入 PHP 数组或对象(比如$_POST直接传会出错) - 富文本内容含 HTML 标签时,确认数据库对应字段是
TEXT或MEDIUMTEXT类型,否则可能被截断
上传封面图后路径没保存或显示 404
ThinkPHP6 的 File->move() 默认只返回移动后的 File 对象,不会自动拼接 URL 路径;开发者常误把临时路径当成品路径存进数据库。
实操建议:
- 移动文件后,用
$file->getSaveName()获取相对路径(如20240512/abc.jpg),再拼上配置的上传根目录(如public/uploads/)才能得到可访问地址 - 数据库中建议只存相对路径(如
uploads/20240512/abc.jpg),然后在模板里用url()或asset()动态生成完整 URL - 别忘了给
public/uploads目录加写权限,Linux 下常见错误是failed to open stream: Permission denied
表单提交后跳转 405 Method Not Allowed
这基本等于控制器方法没声明接收 POST 请求,ThinkPHP6 的路由和中间件对请求方法校验更严格了。
实操建议:
- 确认路由定义用了
POST显式限定,例如Route::post('article/save', 'ArticleController@save');,而不是笼统的Route::rule() - 检查控制器方法是否加了
public function save(Request $request)参数类型提示,漏掉Request类型会导致框架无法注入,进而触发方法签名不匹配 - 如果用了 CSRF 验证(默认开启),确保表单里有
{:token()}或手动输出<input type="hidden" name="__token__" value="{:token()}">
编辑文章时更新失败但无报错
ThinkPHP6 模型的 save() 在主键不存在时会执行插入而非更新,而前端传的 id 若为空字符串、null 或非法值,就容易静默插入一条新记录。
实操建议:
- 编辑前先用
ArticleModel::find($id)查一次,若返回 null,直接抛异常或重定向,避免后续操作错位 - 更新时显式指定主键:用
$model->isUpdate(true)->save($data),比单纯$model->save($data)更可靠 - 别依赖表单隐藏域传
id,后端一定要从 URL 路径或请求参数中二次校验,防止用户篡改造成越权更新
真正麻烦的是多字段联动验证(比如草稿状态允许空标题,发布状态则必须填),这类逻辑得收口到模型的 validateScene() 里,而不是堆在控制器里做 if 判断。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











