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开发团队。