云迈博客

您现在的位置是:首页 > 后端开发 > PHP > 正文

PHP

随机视频推荐

阳帅2021-08-31PHP402
最近项目碰到到这样一个需求:视频分类有两级,视频关联子分类(多对多关系),视频按照子分类随机推荐,1:1推荐,分类数据过少,自动补全一开始是准备用波哥之前文档那种高效的随机查询数据的方式来实现简单运用

最近项目碰到到这样一个需求:
视频分类有两级,视频关联子分类(多对多关系),视频按照子分类随机推荐,1:1推荐,分类数据过少,自动补全
一开始是准备用波哥之前文档那种高效的随机查询数据的方式来实现
简单运用了一下,原生sql的方式用tp5方式来写实在不太友好,而且子分类是不是固定的,还是用whereIN的方式去查,在加上一些逻辑判断,视频数据补全,所以有了以下方法,方法暂未解决数据重复的问题,不过又不是不能用,如果大家有好的建议,希望多多指教:kissing_heart:

public function random_video()
    {
        $url = request()->domain();
        $data = $this->request->request();
        $validate = $this->validate(
            $data,
            [
                ['category', 'require'],//分类id 示例1,2,3
                ['class_level', 'require|integer'],
                ['num', 'require|integer'],//查询数量
            ]
        );
        if ($validate !== true) {
            $this->error($validate);
        }

        $hide = 0;//刷新按钮显示隐藏
        $cate = explode(',', $data['category']);
        $count = count($cate);
        $avg = intval($data['num'] / $count);
        //查分类统计是否大于当前num
        $allCount = Video::alias('t1')
            ->field('*')
            ->join('VideoCategoryBind t2', 't1.id = t2.video_id')
            ->whereIn('t1.level', $this->video_level($data['class_level']))
            ->whereIn('t2.category_id', $cate)
            ->count();

        //如果大于
        if ($allCount > $data['num']) {
            //获取每个分类的统计
            $cateCount = [];
            foreach ($cate as $k => $v) {

                $ccount = Video::alias('t1')
                    ->field('*')
                    ->join('VideoCategoryBind t2', 't1.id = t2.video_id')
                    ->whereIn('t1.level', $this->video_level($data['class_level']))
                    ->where('t2.category_id', $v)
                    ->count();
                $cateCount[$k] = ['count' => $ccount, 'id' => $v];
            }

            //根据count升序排序
            $last_names = array_column($cateCount, 'count');
            array_multisort($last_names, SORT_ASC, $cateCount);
            $z = 0; //定义追加值
            $all = [];
            $f = 0;//判断是不是随机的分类

            $lastCount = $count;
            foreach ($cateCount as $k1 => $v1) {

                if ($v1['count'] < $avg) {//小于平均数

                    if ($v1['count'] > 0) {//大于0
                        $list = $this->video_data($v1['id'], 0, $avg);
                        $z = $z + ($avg - $v1['count']);      //追加=追加+(平均数-当前分类统计数)
                    } else {
                        //小于等于0
                        $list = [];
                    }

                    //计算剩余分类数
                    $lastCount = $count - $k1 - 1;
                } else {//大于平均数 根据追加后的平均值来做正常处理
                    //平均数=(总数-累计追加数)/(总分类数-剩余分类数)

                    $avgNew = ($data['num'] - $z) / $lastCount;
                    $remainder = ($data['num'] - $z) % $lastCount;//拿到余数
//                    var_dump('当前平均数' . $avgNew . '=(总数:' . $data['num'] . '- 累计追加数:' . $z . ')/剩余分类数:' . $lastCount . ')');
                    //加入随机查询
                    $page = $v1['count'] - $avgNew;

                    if ($page > 0) {
                        $page = mt_rand(0, $page);
                    } else {
                        $page = 0;
                    }
                    if ($f == 0) {
                        $list = $this->video_data($v1['id'], $page, $avgNew + $remainder);
                    } else {
                        $list = $this->video_data($v1['id'], $page, $avgNew);
                    }

                    $f++;
                }
                //数据累加
                if (empty($all)) {
                    $all = $list;
                } else {
                    $all = array_merge($all, $list);
                }

            }
        } else {
            //查所有的数据
            $all = collection(Video::alias('t1')
                ->field('*')
                ->join('VideoCategoryBind t2', 't1.id = t2.video_id')
                ->whereIn('t2.category_id', $cate)
                ->whereIn('t1.level', $this->video_level($data['class_level']))
                ->select())->toArray();
            $hide = 1;//刷新按钮显示隐藏
        }

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~