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

Laravel查询优化:仅返回匹配crequest的requests表唯一数据

搞定Laravel查询重复Requests记录的问题

嘿,我明白你的需求啦:当当前登录用户的ID在crequest.users_allow里时,只返回唯一的requests表记录,不需要带crequest的详情,现在你的查询因为关联了多条匹配的crequest行,导致requests数据重复了,这就来帮你修正!

问题出在哪?

你的原查询用了leftJoin,如果一个requests对应多条符合条件的crequest记录,就会把同一个requests数据重复返回好几次。另外我注意到你写的orderBy('forms_cartable.id','desc'),但整个查询里根本没用到forms_cartable表,应该是笔误吧?改成requests.id才对哦。

方案1:用distinct()去重(简单直接)

如果你还是想保持关联查询的写法,那可以只选择requests表的字段,再加上distinct()来确保每个requests只返回一次:

$cartable = DB::table('requests')
    ->select('requests.*') // 只取requests表的所有字段,不要crequest的内容
    ->leftJoin('crequest', 'crequest.request_id', '=', 'requests.id')
    ->whereRaw("FIND_IN_SET(?, crequest.users_allow)", [$userid]) // 用参数绑定避免SQL注入风险
    ->orderBy('requests.id', 'desc')
    ->distinct() // 去重,过滤掉重复的requests记录
    ->get();

方案2:用exists子查询(更高效)

这种方法其实更推荐,因为它只会检查是否存在符合条件的crequest记录,不需要把两个表全关联起来,天然不会产生重复数据:

$cartable = DB::table('requests')
    ->whereExists(function ($query) use ($userid) {
        $query->select(DB::raw(1))
              ->from('crequest')
              ->whereColumn('crequest.request_id', 'requests.id')
              ->whereRaw("FIND_IN_SET(?, crequest.users_allow)", [$userid]);
    })
    ->orderBy('requests.id', 'desc')
    ->get();

小提醒

  • 一定要注意SQL注入风险!我在代码里把直接拼接$userid改成了参数绑定的方式,这样更安全。
  • 你原查询里写的crequest.user_allows,根据你给出的表结构应该是crequest.users_allow,我已经在修正后的代码里调整过来啦。

内容的提问来源于stack exchange,提问作者lock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:30:11