关于tp5.1.9升级查询的一点讨论

浏览:504 发布日期:2018/04/14 分类:ThinkPHP5专区
我们在开发的时候如果利用控制器的继承 ,写一些共用一点的方法,可以节约一些开发时间。比如很多数据表都有列表翻页查询,可以不用每个控制器都去写一个逻辑很相似的代码,我们随便看一个小例子:
假如父类代码有:function show()
    {
        //可能有很多通用 条件的判断和默认处理  这里随便举例一个
        if (!isset($this->local['where']['is_verify'])) {
            $this->local['where']['is_verify'] = 1;
        }   
        //其中的条件、排序....很多情况都可以通过$this->local从子类传过来,不失灵活
        $list =db(request()->controller())->where($this->local['where'])->order($this->local['order'])->paginate(15);
        $this->assign('list', $list);
    }
然后子类随便举个例子:function show()
    {
        //定义子类业务中的很多条件 
        $this->local['where']['status'] = ['status', '>=', 2];
        //.....
        parent::show();
    }
在5.0.x时期我们的子类的条件可能是这样写的$this->local['where']['status'] = [ '>=', 2];
$this->local['where']['menu_id'] = 3;
5.1.9之前的 我们子类的条件可能是这样写的$this->local['where']['status'] = [ 'status','>=', 2];
$this->local['where']['menu_id'] = 3;
这2种情况,不管怎么变,父类方法中都还是可以进行条件判断的if (isset($this->local['where']['status'])) {
   .....
}
到了5.1.9以后,我们只能这样定义了$this->local['where'][] = [ 'status','>=', 2];
$this->local['where']['menu_id'] = 3;// 或 $this->local['where'][] = [''menu_id', '=', 3];
这样以后,我感觉父类中有些条件相关的判断就不怎么好写了 ,而且很多地方也需要去修改条件了。为了少修改点地方,也为了不改变我们现有的业务,那我们就只有按照tp想要的where数组结构写了一个这样的函数, 把我们之前的where结构转换成5.1.9所需要的结构。
//当然这个函数可能还没有把所有情况考虑好,有bug我们再加吧,姑且先这样看到function parse_new_where($where) {
    if (empty($where)) {
        return [];
    }
    if (is_array($where)) {
        $newWhere = [];
        foreach ($where as $field => $condition) {
            if (!is_numeric($field)) {
                if (is_array($condition)) {
                    if (is_string($condition[0]) && $condition[0] != $field) {
                        array_unshift($condition, $field);
                    }
                    $newWhere[] = $condition;                    
                } else {
                   $newWhere[] = [$field, '=', $condition];
                }                
            } else {
                $newWhere[] = $condition;
            }
        }
        return $newWhere;
    } else {
        return $where;
    }
}
然后就每个查询的where条件都交给这个函数处理下,我们的父类这样的修改了下$list =db(request()->controller())->where(parse_new_where($this->local['where']))->order($this->local['order'])->paginate(15);其他地方的逻辑代码...就都不用改了。

看似这次5.1.9关于查询条件的问题,已经决解了。但我想讨论的是,这种业务还是算比较常见了,不然每个控制器都单独写类似于这样的分页逻辑,代码就有点冗余了。
那各位大神或 流年 大大神,还有更好的决解方法没有?或者恢复以前可以关联数组的方式(有bug,肯定有法决解的)?
------------------------------------------------------------------------------------------
另外,发现一个不知道算不算bug的东西:
同一个页面,article belongsTo menu 使用width关联查询:
5.1.8的sql:
[ SQL ] SELECT 字段列表 FROM woo_article ORDER BY list_order DESC,id DESC LIMIT 0,15 [ RunTime:0.000000s ]
[ SQL ] SHOW COLUMNS FROM woo_menu [ RunTime:0.002000s ]
[ SQL ] SELECT id,title FROM woo_menu WHERE id IN (26,11,3) [ RunTime:0.001001s ]
5.1.9的sql:
[ SQL ] SELECT 字段列表 FROM woo_article ORDER BY list_order DESC,id DESC LIMIT 0,15 [ RunTime:0.001000s ]
[ SQL ] SHOW COLUMNS FROM woo_menu [ RunTime:0.003000s ]
[ SQL ] SELECT id,title FROM woo_menu WHERE id = 3 AND id IN (26,11,3) [ RunTime:0.000000s ]

5.1.9 的关联menu的查询条件 多了一个id=xxx的条件,这样查询结果是有问题的。 应该是框架最新调整还是有点问题,麻烦看下。支持TP。



最佳答案
评论( 相关
后面还有条评论,点击查看>>