Lumen 默认不启用 Eloquent,需在 bootstrap/app.php 中调用 $app->withEloquent() 并确保 DatabaseServiceProvider 已注册、$app->configure('database') 已执行,模型须位于 app/Models/ 且命名空间为 App\Models,否则会报类未找到或数据库未选中等错误。

为什么 Lumen 的 Eloquent 默认不工作
直接在 Lumen 里 use App\Models\User; 然后 User::find(1),大概率报错 Call to undefined method Illuminate\Foundation\Application::make() 或 Class 'App\Models\User' not found。这不是模型写错了,而是 Lumen 默认没开 Eloquent 支持——它连数据库服务提供者都懒加载,更别说 ORM。
必须手动启用:
- 打开
bootstrap/app.php,取消注释这行:$app->withEloquent(); - 确保
$app->register(Illuminate\Database\DatabaseServiceProvider::class);已注册(Lumen 9+ 默认已注册,但老版本可能被注释) - 模型类必须放在
app/Models/下,且命名空间是App\Models,否则自动加载会失败
Lumen 中 Model::all() 报错 “No database selected”
这个错误不是 SQL 语法问题,是配置没生效。Lumen 不读 .env 里的数据库配置,除非你显式调用 $app->configure('database');。
实操步骤:
- 确认
config/database.php存在(Lumen 不自带该文件,需从 Laravel 复制或手写) - 在
bootstrap/app.php中,在$app->withEloquent();之前加上:$app->configure('database'); -
.env中必须有DB_CONNECTION=mysql、DB_HOST、DB_DATABASE等完整项,漏一个就 fallback 到 sqlite,而 sqlite 驱动常未安装
查询时 where() 和 orderBy() 不生效
常见于链式调用写成 User::where('active', 1)->orderBy('id')->get() 却返回空数组,但直接查表又有数据。根本原因是 Lumen 默认关闭了查询日志和调试模式,你根本看不到它到底发了什么 SQL。
排查建议:
- 临时开启查询日志:
DB::enableQueryLog();,然后dd(DB::getQueryLog());查看实际执行的语句 - 检查字段名是否带表前缀(比如
users.id写成id在某些 MySQL 模式下会失效) -
orderBy()后没加参数默认是ASC,但如果你传了null或空字符串,Lumen 会静默忽略整个子句,不报错也不警告
Lumen 模型里用 $fillable 却提示 MassAssignmentException
这个异常在 Lumen 里比 Laravel 更容易触发,因为默认没开批量赋值白名单保护,但一旦你写了 $fillable,框架反而会严格校验——哪怕只是 User::create(['name' => 'a']) 这种简单操作。
关键点:
- 确保
$fillable数组里是真实存在的字段名,大小写必须完全一致(MySQL 表字段是user_name,你就不能写username) - 如果模型继承了
Illuminate\Database\Eloquent\Model但没声明$fillable,Lumen 会拒绝所有create()和fill(),必须显式设为空数组:protected $fillable = [];或指定字段 - 别依赖
$guarded = [],Lumen 对它的支持不稳定,优先用$fillable
复杂点在于:Lumen 的模型行为高度依赖 bootstrap/app.php 里那一小段配置顺序,多一行少一行、位置错一位,都可能导致 ORM 看似加载成功,实则部分功能被静默禁用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











