三层代理 如何更好的查询上下级


for ($i=1; $i<=3; $i++)
        {
            $user_parent_id = $this->get_top_agent($id,$i);
            if($user_parent_id == '0'){
                break;
            }
        }

public function get_top_agent($id,$level){
if($level == 1){
            //上级代理ID
            $user_parent_id = DB::table('users')->where('id',$id)->value('user_parent_id');
            if($user_parent_id == '0'){
                return $user_parent_id;
            }
        }

        if($level == 2){
            $user_parent_id = DB::table('users')->where('id',$id)->value('user_parent_id');
            $user_parent_id = DB::table('users')->where('id',$user_parent_id)->value('user_parent_id');
            if($user_parent_id == '0'){
                return $user_parent_id;
            }
        }

        if($level == 3){
            $user_parent_id = DB::table('users')->where('id',$id)->value('user_parent_id');
            $user_parent_id = DB::table('users')->where('id',$user_parent_id)->value('user_parent_id');
            $user_parent_id = DB::table('users')->where('id',$user_parent_id)->value('user_parent_id');
            if($user_parent_id == '0'){
                return $user_parent_id;
            }
        }
}

自己写的查询上级代理的ID,如果是0就等于查询结束
写的比较固定 有没有更好的写法?
以及如何查询下级用户? 把整个users表都 foreach一遍吗?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 13

写的有问题吧,查来查去不都是 0?
用递归简化代码,类似这样,但是要处理好数据错误可能造成的无限递归

// 获得顶级代理ID
public function get_top_agent_id($id) {
  $user = DB::table('users')->select(['id','user_parent_id'])->where('id',$id)->first();
  if (!$user) {
      throw new \Exception('not exist');
  }
  if ($user->user_parent_id === 0) {
    return  $user->id;
  }
  return $this->get_top_agent($user->user_parent_id);
}
2年前 评论
AegisforPhP (楼主) 2年前
php_yt (作者) 2年前

改进一下@php_yt 的代码为如下:

/**
     * 查询指定层数顶级代理
     * @param int $id       要查询的id
     * @param int $level    要查询的层级    
     * @return int          结果
     * @throws Exception    没有这个人
     */
    public function get_top_agent($id,$level) {
        $user = DB::table('users')->select(['id','user_parent_id'])->whereIn('id',$id)->first();
        if (!$user) {
            throw new \Exception('not exist');
        }
        if ($user->user_parent_id === 0 || $level===1) {
            return  $user->id;
        }
        return $this->get_top_agent($user->user_parent_id,$level-1);
    }
2年前 评论

把所有上级的 id 都以 json 格式存在表里面。然后查的时候就很简单了。

2年前 评论
风吹过有夏天的味道 2年前

file

目前我一个项目中这样设计的,同样的固定三级代理,一个上级、一个顶级字段,创建的时候可以写个观察者 creating 查询对应的祖先id赋值到对应的字段。
虽然字段冗余, 但是后续各种查询相对比较容易哦,目前项目已经完成,没遇到什么大的问题
例如:

/**
 * 下级代理
 */
public function scopeSons(Builder $builder, $value)
{
    $builder->when(filled($value),
        fn(Builder $whenQuery) => $whenQuery->where(fn($query) => $query->where('parent_id', $value)
        )
    );
}
/**
 * 所有下级代理
 * @param  Builder  $builder
 * @param $value
 */
public function scopeDescendants(Builder $builder, $value)
{
    $builder->when(filled($value),
        fn(Builder $whenQuery) => $whenQuery->where(fn($query) => $query->where('parent_id', $value)
            ->orWhere('top_id', $value)
        )
    );
}
2年前 评论
AegisforPhP (楼主) 2年前
王小大 (作者) 2年前

MPTT left 和right 加上 一个deep范围 一句简单的SQL轻松捞出N级代理

2年前 评论

超过2层可刑

2年前 评论
AegisforPhP (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!