
本文详解在 slim(非 laravel)环境中集成 illuminate/database + eloquent 时,插入数据失败的常见原因及完整解决方案,涵盖模型配置、时间戳字段缺失修复、数据库连接初始化和错误调试方法。
本文详解在 slim(非 laravel)环境中集成 illuminate/database + eloquent 时,插入数据失败的常见原因及完整解决方案,涵盖模型配置、时间戳字段缺失修复、数据库连接初始化和错误调试方法。
在 Slim 框架中独立使用 Laravel Eloquent(即“Slim + Illuminate Eloquent”组合)是一种轻量级但易出错的实践。你遇到的 500 Internal Error 并非 Eloquent 本身问题,而是底层 SQL 执行失败导致的——核心原因在于:你的 users 表缺少 Eloquent 默认要求的时间戳字段 created_at 和 updated_at。
Eloquent 的 Model::create() 方法默认会尝试自动写入 created_at 和 updated_at 字段(除非显式禁用)。而你的表结构中仅有 created_on 和缺失 updated_at,且未关闭时间戳功能,导致 INSERT 语句因字段不存在而报错(如 SQLSTATE[42S22]: Column not found),最终被封装为 500 错误。
✅ 正确做法分三步:
1. 补全或适配时间戳字段(推荐方案)
修改数据库表,添加 Eloquent 标准时间戳字段(最兼容):
ALTER TABLE `users` ADD COLUMN `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, ADD COLUMN `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
同时,在模型中明确指定时间戳字段名(若坚持用 created_on/updated_on):
// App/Models/User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $table = 'users';
protected $fillable = ['first_name', 'last_name'];
// ✅ 关键:覆盖默认时间戳字段名
const CREATED_AT = 'created_on';
const UPDATED_AT = 'updated_on'; // 注意:原表无此字段,需先添加
}
⚠️ 若选择自定义字段名,请务必同步执行 ALTER TABLE users ADD COLUMN updated_on TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
2. 禁用时间戳(快速验证方案,不推荐生产使用)
若暂时无法修改表结构,可在模型中彻底关闭时间戳:
class User extends Model
{
protected $table = 'users';
protected $fillable = ['first_name', 'last_name'];
public $timestamps = false; // ? 关键:禁用自动时间戳
}
此时 create() 不再尝试写入 created_at/updated_at,可立即生效。
3. 确保 Eloquent 数据库连接已正确初始化
Slim 中需手动启动 Eloquent(常在 bootstrap/app.php 或 config/database.php 中):
use Illuminate\Database\Capsule\Manager as Capsule;
$capsule = new Capsule;
$capsule->addConnection([
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'your_db',
'username' => 'root',
'password' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
]);
$capsule->setAsGlobal();
$capsule->bootEloquent(); // ? 必须调用!否则模型无法连接数据库
4. Controller 中安全插入数据(含错误处理)
use App\Models\User;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
public function index(Request $request, Response $response)
{
try {
// ✅ 使用 fill() + save() 替代 create() 可更好控制流程
$user = new User();
$user->fill([
'first_name' => $request->getParam('email'), // ⚠️ 注意:此处逻辑疑似有误,email 应存入 email 字段而非 first_name
'last_name' => 'team',
]);
$user->save();
return $response->withJson([
'success' => true,
'data' => $user->toArray()
], 201);
} catch (\Illuminate\Database\QueryException $e) {
error_log('DB Insert Error: ' . $e->getMessage());
return $response->withStatus(500)->withJson([
'success' => false,
'error' => 'DATABASE_ERROR',
'message' => 'Failed to insert user'
]);
}
}
? 调试提示:
- 开启 Eloquent 查询日志定位具体 SQL 错误:DB::enableQueryLog(); dd(DB::getQueryLog());
- 检查 id 字段是否设为 AUTO_INCREMENT(当前 BIGINT NOT NULL 会导致主键冲突):
ALTER TABLE `users` MODIFY `id` BIGINT(20) NOT NULL AUTO_INCREMENT;
? 总结:Slim 中使用 Eloquent 插入失败,90% 源于时间戳字段缺失/不匹配或数据库连接未 bootEloquent()。补全 created_at/updated_at 字段并确保 $capsule->bootEloquent() 已执行,即可稳定使用 Model::create()。











