larvel 暴力子查詢

public function getQuery($select = [])
{
    if (empty($select)) {
        //默認篩選字段
        $select = [
            'invite_activity_user_rank.id',
            'invite_activity_user_rank.vip_at',
            'invite_activity_user_rank.act_id',
            'invite_activity_user_rank.mobile',
            'invite_activity_user_rank.user_id',
            'invite_activity_user_rank.vip_number',
            'invite_activity_user_rank.is_virtual',
            'invite_activity_user_rank_award.id AS award_id',
            'invite_activity_user_rank_award.reward_name',
            'invite_activity_user_rank_award.reward_type'
        ];
    }
    $query = InviteActivityUserRankModel::select($select)
        ->leftJoin('invite_activity_user_rank_award', function($join) {
            //用戶的獎勵詳情
            $join->on('invite_activity_user_rank_award.act_id', '=', 'invite_activity_user_rank.act_id')
                ->on('invite_activity_user_rank_award.user_id', '=', 'invite_activity_user_rank.user_id');
        })
        ->where('invite_activity_user_rank.act_id', $this->activityId)
        ->orderBy('invite_activity_user_rank.vip_number', 'desc') //邀請人數排序順序
        ->orderBy('invite_activity_user_rank.vip_at', 'asc')    //最先邀請人的排前面
        ->orderBy('invite_activity_user_rank.id', 'asc');    //最先邀請註冊的排前面

    //查詢用戶詳細情況
    if ($this->isshowUserDetail) {
        $query = $query->leftJoin('users', 'users.id', '=', 'invite_activity_user_rank.user_id')
            ->leftJoin('user_groups', 'user_groups.id', '=', 'users.group_id')
            ->select(array_merge($select, [     //擴展查詢字段
                'user_groups.group_name',
                'invite_activity_user_rank_award.province_id',
                'invite_activity_user_rank_award.city_id',
                'invite_activity_user_rank_award.district_id',
                'invite_activity_user_rank_award.address',
            ]));
    }

    //構造一個排名的sql
    $sql = "
        (
            select
                t.*, @user_rank := @user_rank + 1 AS user_rank
            from
                (SELECT @user_rank := 0) r,({$query->toSql()}) as t
        ) as b

    ";
    $query = DB::table(DB::raw($sql))
        ->select(DB::raw('b.*'))
        ->mergeBindings($query->getQuery());

    //有輸入手機
    if ($this->isInput($this->mobile)) {

        $query->whereRaw("b.mobile = '{$this->mobile}'");
    }
    //不顯示虛擬數據, 只顯示真實用戶
    if ($this->isInput($this->not_virtual) && $this->not_virtual == InviteActivityUserRankModel::IS_VIRTUAL ) {
        $isUser = InviteActivityUserRankModel::IS_USER;
        $query->whereRaw("b.is_virtual = '{$isUser}'");
    }
    return $query;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章