首页 编程语言 php

thinkphp6更新后column 的key失效

最近更新了tp6,把phpstudy 换成了phpenv,然后就出问题了。原来联合查询后,使用column,让键值等于主表ID,可以快速获取其他关联表对应的主表信息,例如:

$depart = Db::name("table")->alias("t")->join("department d", 'd.did=t.depart_id', 'left') 
  ->where([['t.status', '=', 1]])->column('t.id,t.name,d.did,d.depart_name', 't.id');

可以快速通过键值获取想要的table和关联的department值,例如:

$t_id=123;
$depart_one=$depart[$t_id]??[];

但是更新tp6后,发现没有获取到值,全部为空;打印了,发现设置的key=》t.id没起作用,就像没有设置key一样,键值是0,1,2……这样的。如果我这样写:

$depart = Db::name("table")->alias("t")
  ->where([['t.status', '=', 1]])->column('t.id,t.name', 'id');

就是key中没有“别名.字段”,只是“字段”就可以,但是我是联合查询,不添加别名,就会报错指向不明。百度了,也没有相关答案,猜测是不是换环境导致的,然后切换mysql版本,切换php版本,重装mysql,重装php,把phpenv卸了重装,都没有效果。后来就去查column原代码,看看如何处理的数据。

找到
vendor/topthink/think-orm/src/db/PDOConnection.php,1143行的column方法,断点测试,打印结果,发现走了1187行的判断:

if (empty($resultSet)) {
            $result = [];
        } elseif (('*' == $column || strpos($column, ',')) && $key) {
//走了这里,打印$resultSet,$key,$result,
//$key=t.id,而$resultSet中没有t.id,只有id,t被之前的代码处理掉了。
            $result = array_column($resultSet, null, $key);
        } else {
//……
}

打印关键数据,$key=t.id,而$resultSet中没有t.id,只有id,t被之前的代码处理掉了。所以,我想者把$key中的t.也处理掉,只剩下id不就能对应上了吗?从else中的代码copy了一段用来处理正合适:

if (empty($resultSet)) {
            $result = [];
        } elseif (('*' == $column || strpos($column, ',')) && $key) {
//新增
 if (is_string($key) && strpos($key, '.')) {
                [$alias, $key] = explode('.', $key);
            }
            $result = array_column($resultSet, null, $key);
        } else {
//……
}

这样便可以了,不过这只是临时处理,等到thinkphp团队把这个问题解决了,就没有这样的问题了。遇到这个问题的小伙伴可以查看相关逻辑代码,来处理这类的问题,然后把问题反馈给tp开发团队。


相关推荐