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
相关产品推荐
相关产品推荐

