You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何从关联模型按不同条件获取多组随机记录?

Laravel中如何从关联模型按不同条件获取多组随机记录?

嘿,我来帮你搞定这个问题!你现在的需求是从关联表中同时获取两组不同条件的随机记录——5条level=1的和3条level=2的,对吧?咱们一步步来解决~

首先,先说说你之前遇到的问题:你复制了myRelation2关联方法但没生效,其实是因为你在查询的时候只在with里指定了myRelation,没有把myRelation2加进去,Laravel自然不会加载这部分数据啦!不过其实不用重复定义几乎一样的关联方法,咱们有更清晰的解决方式。

方案一:定义语义化的关联方法(推荐)

先在你的Quiz模型里,针对不同level的需求定义两个明确的关联方法,这样代码可读性更高:

// 获取level=1的关联记录
public function level1Questions() {
    return $this->hasMany(Qq2::class, 'q_id', 'id')
                ->with('qA')
                ->where('level', 1);
}

// 获取level=2的关联记录
public function level2Questions() {
    return $this->hasMany(Qq2::class, 'q_id', 'id')
                ->with('qA')
                ->where('level', 2);
}

然后在查询的时候,通过with同时加载这两个关联,并且分别设置随机排序和取数:

$res = Quiz::select('id','name', 'price')
    ->with([
        // 从level1Questions里随机取5条
        'level1Questions' => function ($query) {
            $query->orderByRaw('RAND()')->take(5);
        },
        // 从level2Questions里随机取3条
        'level2Questions' => function ($query) {
            $query->orderByRaw('RAND()')->take(3);
        }
    ])
    ->where('flag_v', '>', 0)
    ->where('status', '=', 1)
    ->first();

方案二:直接在with里用闭包定义多组查询(无需修改模型)

如果不想额外定义关联方法,也可以直接在查询的with里用不同的键来定义两组查询,直接复用原有的myRelation关联逻辑:

$res = Quiz::select('id','name', 'price')
    ->with([
        // 第一组:level=1,随机5条
        'level1Questions' => function ($query) {
            // 复用myRelation的关联约束,再加上自定义条件
            $query->mergeConstraintsFrom((new Quiz)->myRelation())
                  ->orderByRaw('RAND()')
                  ->take(5)
                  ->where('level', '=', 1);
        },
        // 第二组:level=2,随机3条
        'level2Questions' => function ($query) {
            $query->mergeConstraintsFrom((new Quiz)->myRelation())
                  ->orderByRaw('RAND()')
                  ->take(3)
                  ->where('level', '=', 2);
        }
    ])
    ->where('flag_v', '>', 0)
    ->where('status', '=', 1)
    ->first();

小提醒

  • 如果你用的是PostgreSQL数据库,记得把RAND()改成RANDOM()哦,不同数据库的随机函数不一样。
  • 这两种方案都会执行两次关联查询(每组条件一次),这是正常的,因为要获取不同条件的独立随机子集。

这样处理后,你就能在返回的$res里同时拿到level1Questions和level2Questions两组数据啦!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 10:53:02