TP5 多态关联 MorphTo 闭包查询 field 函数无效

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() ,慎重点不替换而做了兼容,如果有闭包存在的,执行闭包、条件查询、子关联查询,没有则原样执行。