项目中有这样一个需求:根据一个指定推广人,找到他的所有推广人名单。
数据库表结构:
agent_log:recommend_user_id为直推上级,recommend_user_id_2为间接推广上级
public function root_stats($root_member_id=0)
{
if(empty($root_member_id)){
$root_member_id = input('root_member_id', 0);
}
$total_arr = [];
while(true){
if(empty($arr_member_id)){
$arr_member_id = [$root_member_id];
}
$arr = Db::name('agent_log')->where('recommend_user_id', 'in', $arr_member_id)
->whereOr('recommend_user_id_2', 'in', $arr_member_id)->group('member_id')->column('member_id');
if(empty($arr)){
break;
}else{
$total_arr = array_merge($total_arr, $arr);
$arr_member_id = $arr;
}
}
$total_arr = array_unique($total_arr);
$total_arr = array_values($total_arr);
$list_mobile = Db::name('member')->where('member_id', 'in', $total_arr)->column('member_name');
//dd($total_arr, $list_mobile);
$data = [
'total' => count($total_arr),
'list' => $list_mobile,
];
ajaxOutFunc(200, $data);//自定义输出数据
}
调用方法:
$data = $this->root_stats(1802695);//得到此人推广的下级数据
效果如下:
至此,已经介绍了两种无级限取数据的方法。无论是递归还是while循环,只要你逻辑清晰,用哪种方法都一样。
|