IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> TP6多态笔记 -> 正文阅读

[PHP知识库]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']]) 

在这里插入图片描述

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:12:35  更:2021-08-10 13:14:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 18:22:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码