zoukankan      html  css  js  c++  java
  • 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,而是开发文档写错了。着重说明:开发文档写错了!!!!!!!

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

  • 相关阅读:
    vba中数据类型
    Excel统计函数COUNTIF()的常规用法介绍
    分类求和
    在每个sheet的相同位置写入相同的值
    Timer函数
    数组总结
    如何制作本地yum源
    HDFS的优缺点
    HDFS安全模式
    HDFS的HA(高可用)
  • 原文地址:https://www.cnblogs.com/fangziffff123/p/7689004.html
Copyright © 2011-2022 走看看