TP6多态笔记

最近研究pearAdmin TP版时看到了获取用户权限时with关联查询的时候,看到了没理解的语句,后面查询了解到是多态用法,下面附上代码

 // 用户的所有权限
    public static function permissions($id,$root)
    {
    
    
        // $aaa = self::with(['roles.permissions', 'directPermissions'])->fetchSql(true)->find($id);
        // roles.permissions 多态用法只,roles模型里的permissions方法
        $admin = self::with(['roles.permissions', 'directPermissions'])->findOrEmpty($id)->toArray();
        $permissions = [];
        //超级管理员缓存所有权限
        if ($admin['id'] == 1){
    
    
            $perms = AdminPermission::order('sort','asc')->select()->toArray();
            foreach ($perms as $p){
    
    
                if($p['status'] == 1){
    
    
                    $permissions[$p['id']] =  $p;
                    $permissions[$p['id']]['href'] = is_url($p['href'])??$root.$p['href'];
                 }
            }
            if(env('APP_DEBUG')==true){
    
    
                $permissions[0] = [
                    "id" => -1,
                    "pid" => 0,
                    "title" => "CRUD",
                    "icon" => "layui-icon layui-icon-util",
                    "href" => $root."/crud/index",
                    "type" => 1,
                ];
            }
        }else{
    
    
             //处理角色权限
             if (isset($admin['roles']) && !empty($admin['roles'])) {
    
    
                foreach ($admin['roles'] as $r) {
    
    
                    if (isset($r['permissions']) && !empty($r['permissions'])) {
    
    
                        foreach ($r['permissions'] as $p) {
    
    
                            if($p['status'] == 1){
    
    
                                $permissions[$p['id']] =  $p;
                                $permissions[$p['id']]['href'] = is_url($p['href'])??$root.$p['href'];
                             }
                        }
                    }
                }
            }
            //处理直接权限
            if (isset($admin['directPermissions']) && !empty($admin['directPermissions'])) {
    
    
                foreach ($admin['directPermissions'] as $p) {
    
    
                    if($p['status'] == 1){
    
    
                       $permissions[$p['id']] =  $p;
                       $permissions[$p['id']]['href'] = is_url($p['href'])??$root.$p['href'];
                    }
                }
            }
            $key = array_column($permissions, 'sort');
            array_multisort($key,SORT_ASC,$permissions);
        }
        //合并权限为用户的最终权限
        return $permissions;
    }

在搜索学习过程中发现了一遍介绍得比较详细得文章《tp6使用with方法改进笔记!》,这边就直接搬他的文章了

用户表模型:User.php

namespace app\common\model;

class User extends BaseModel
{
    
    
    /*
     * 微信信息关联
     */
    public function userWeixin()
    {
    
    
        return $this->hasOne(UserWeixin::class,'user_id')->bind([
            'nickname'=>'nickName',
            'openid'=>'wxOpenid',
            'headimg'=>'headImg',

        ]);
    }
    //多级关联上级取指定字段
    public function up()
    {
    
    
        return $this->belongsTo(User::class,'upid')->field('id,mobile,upid');
    }

}

有问题写法(中间一级丢失微信关联):

$user = User::field('id,mobile,upid')
    ->with(['userWeixin','up','up.userWeixin','up.up','up.up.userWeixin'])
    ->where('id','=',function($query) use($uid){
    
    
        $query->name('user')->where("id = {
      
      $uid}")->field('upid');
    })->find()->toArray();

在这里插入图片描述
改进写法:

$user = User::field('id,mobile,upper')
   ->with(['userWeixin','up'=>['userWeixin','up'=>['userWeixin']]]) 
   ->where('id','=',function($query) use($uid){
    
    //因为传的ID是当前用户,需要的是上级用户ID
       $query->name('user')->where("id = {
      
      $uid}")->field('upid');//简写
      # $query->table(config('database.connections.mysql.prefix').'user')->where("id = {$uid}")->field('upid');
   })->find()->toArray() ;
dd($user); 

语法对比:

 with(['userWeixin','up','up.userWeixin','up.up','up.up.userWeixin']) 
 with(['userWeixin','up.userWeixin','up.up.userWeixin'])  
改成下面写法:
 with(['userWeixin','up'=>['userWeixin','up'=>['userWeixin']]]) 
 with(['userWeixin','up'=>['userWeixin','up.userWeixin']]) 

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35606400/article/details/119518319