最近研究pearAdmin TP版时看到了获取用户权限时with关联查询的时候,看到了没理解的语句,后面查询了解到是多态用法,下面附上代码
public static function permissions($id,$root)
{
$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){
$query->name('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']])

|