tp5.0.24
这是在多态关联预载入查询中出现的问题,起因是想控制关联模型输出的字段。
一开始是这样查询的,返回profile全部字段。
$this->model->with([
'profile' => function($query) {
$query->field('email,phone');
}
])->select();
定位原因
thinkphp\library\think\model\relation\MorphTo.php 178 行
这里的方法 eagerlyResultSet 注释为 预载入关联查询 有4个参数,其中的 $closure 闭包 很怪,定义了但是不使用。
// 查找所有记录,但没执行闭包中的 field(),所以在这里入手。
$list = $obj->all($val, $subRelation);
修改为
if ($closure) {
call_user_func_array($closure, [ & $obj]);
$list = $obj->where([$pk => ['in', $val]])->with($subRelation)->select();
} else {
$list = $obj->all($val, $subRelation);
}
解释一下
这里参考了 think\model\relation\OneToOne eagerlyWhere() ,$obj->all() 方法主要执行了 where() 和 with() ,慎重点不替换而做了兼容,如果有闭包存在的,执行闭包、条件查询、子关联查询,没有则原样执行。