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,而是开发文档写错了。着重说明:开发文档写错了!!!!!!!

   今天的分享就到这里吧。学习中!!!!!!!!

 

转载于:https://www.cnblogs.com/fangziffff123/p/7689004.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值