thinkphp5.1中对多对多关联查询的bug

浏览:173 发布日期:2018/08/02 分类:技术分享 关键字: 多对多 关联查询 匿名函数的调用 排序
在thinkphp5.1中多对多关联查询时,如果查询的多对多关联查询中对字段order排序,无法实现的问题:例如:
有user(用户表)、role_user(用户角色表——中间表)、role(角色表)、access(角色权限表)、node(权限表),五张表。
现有需求是查询某一个用户拥有的角色以及权限查询。
定义USER模型为:User.php模型:
namespace app\index\model;


use think\Model;

class User extends Model
{
    protected $pk = 'user_id';
    public function roles()
    {
        return $this->belongsToMany('Role','role_user');
    }

}
Role.php模型:

namespace app\index\model;


use think\Model;

class Role extends Model
{
    protected $pk = 'role_id';
//    protected $hidden = ['pivot','pid','status','remark'];

//    public function accessRole()
//    {
////        return $this->hasMany('Access','role_id');
//    }
    public function nodes()
    {
        return $this->belongsToMany('Node','access');//->order('node_id','desc');
    }
}
Node.php模型:

namespace app\index\model;


use think\Model;

class Node extends Model
{
    protected $pk = 'node_id';
    protected $hidden = ['pivot'];
}
在Index.php控制器中index方法查询:    public function index()
    {
        $Tdata = User::with([
                'roles'=>[
                        'nodes'=>function($query) {
                                $query->order('node_id','desc');
                            }
                        ]
            ])
            ->where('user_id',3)
            ->select();
        return json($Tdata);
    }
测试发现,数据可以查询,但是权限并没有进行排序:

阅读源码发现:在多对多关系中,输入传入了$Closuer匿名函数,但是未使用,,而在一对多等其他关联关系中使用了,
因此:手工改造了BelongsToMany.php中的,最后在方法:belongsToManyQuery中使用了匿名函数:
,最后运行原来的测试方法,正确实现了排序。
最佳答案
评论( 相关
后面还有条评论,点击查看>>