假如父类代码有:
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,ti
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,ti
5.1.9 的关联menu的查询条件 多了一个id=xxx的条件,这样查询结果是有问题的。 应该是框架最新调整还是有点问题,麻烦看下。支持TP。
最佳答案