Lumen中Model::find()未按主键查询,返回全表数据求助
问题分析与解决方案
哎,你这明显是调用方法的时候踩了个小坑!核心问题出在你在find()之后又多调用了get()或者first(),这直接打乱了Laravel/Lumen的查询逻辑:
Board::find($boardId)本身就已经完成了查询,它会直接返回匹配主键boardId的单条模型实例(如果存在的话),找不到就返回null。- 当你在后面链式加个
get(),相当于重新发起了一个不带任何条件的查询,也就是select * from board,自然会返回所有数据。 - 同理,
find($boardId)->first()也会先执行find()拿到单条实例,然后又调用first()重新查一遍表的第一条数据,完全不是你想要的效果。
正确的调用姿势
你只需要直接用find()就行,多余的方法全去掉:
$boardId = 2; return Board::find($boardId);
如果想确保一定能拿到数据(找不到就抛异常),可以用findOrFail():
$boardId = 2; return Board::findOrFail($boardId);
额外排查点(如果上面的方法还不行)
虽然你的模型配置看起来没啥问题,但可以再确认这两点:
- 确保
board表的主键字段确实是boardId,如果这个主键不是自增类型的,记得在Board模型里加一行public $incrementing = false;。 - 检查
CustomModel是不是正确继承了Illuminate\Database\Eloquent\Model,而且有没有重写find()方法搞乱了原本的逻辑。
内容的提问来源于stack exchange,提问作者Jeroen
相关产品推荐
相关产品推荐

