Thinkphp5.0 查询域在模型操作下的异常与分析小例 User::scope('status') ->all()报错
一 问题重现:
1。在用Thinkphp5.0进行模型操作时,需要用到查询域。
在用户User 模型中配置查询域
意思是给User模型增加一个自动的查询范围,根据开发手册的驼峰命名规范,scope+(字段首字母大写),可以为status字段定义一个查询方法,传一个固字的常量$query进去,进行链式查询,查找所有status=1的数据。
2 控制器执行
先看手册说明:
根据手册修改后如下代码,意为根据status=1查询所有用户数据:
浏览器执行 index控制器下的scope方法,不是想像中的成功,而是在debug模式下,提示query执行的all()方法不存在。
问题来了,明明根据开发手册来的,复制都报了错。
错在了哪?为什么?
二 问题解决
遇到问题,着先不能着急,先根据报错提示,猜想几种可能,慢慢缩小错误范围。
先来几种猜测:
1 模型配置错误
2 all方法确实不存在
3 查询域定义错误
然后一一测试。
首选执行User::all(),用User模型的all()方法返回数据库user表的所有数据,并用遍历的方法打印出所有用户名。 看一下结果如何。
浏览器执行
返回成功,说明猜测中的模型配置和all()方法没有问题。难道是查询域的问题??
再查看开发手册如下提示:
写法确实没问题,照样复制了也不行。
问题是什么呢??
重新梳理一下思路.
回顾以前的User::all(),是查找所有用户。如果是所有status字段为1的话,还是所有用户吗???
之前进行链式操作时,find()和select()方法告诉我们,一个是查一条数据,一个是查符合条件的所有数据。
$list=User::scope('status')->all();形式如链式,是不是换成select()方法???如下修改控制器。
浏览器测试,只返回了status=1的三条数据,显然成功了。
显然,User::scope('status')->select()是正确的写法。
想想也是啊,是取某个特定查询范围的所有值,怎么能all()呢??当然是select()了。无论是sql原生语句还是链式操作,怎么能用all()呢????
虽然开发文档写错了。只能呵呵了。
看来学习这东西,不能全信,实战测试,才是根本要领。
三 问题拓展
如果说这是旧版本bug,开发文档是没有跟随版本的即时更新, 那换个版本效果如何呢???
特意从官网和其它源码找了两个版本测试,实测效果均是同上。
User::scope('status')->select()是正确的写法.
User::scope('status')->all()是错误的写法,
也就是说,这不是框架的bug,而是开发文档写错了。着重说明:开发文档写错了!!!!!!!
今天的分享就到这里吧。学习中!!!!!!!!