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

Laravel查询问题:如何获取未分配任务的活跃Job列表

解决未分配任务的活跃Job查询问题

我来帮你搞定这个查询问题!你现在的代码用了默认的内连接(join 等价于 inner join),这会只返回那些在 tasks 表中有对应任务记录的Job,而且因为一个Job可能对应多个Task,结果里就会重复出现同一个Job的数据——这正好和你要的结果相反。

下面给你几种靠谱的修改方案,任选其一都能拿到未分配任务的活跃Job:

方案1:左连接 + 空值筛选(最直观)

使用leftJoin保留所有活跃Job,再筛选出没有匹配到Task的记录:

$jobs = Job::select('jobs.*')
    ->where('is_active', '=', 1)
    ->leftJoin('tasks', 'jobs.number', '=', 'tasks.job_number')
    ->whereNull('tasks.id') // 筛选出没有对应Task的Job
    ->get();

原理:左连接会把所有符合is_active=1的Job都列出来,不管有没有对应的Task;那些没有分配任务的Job,在tasks表的对应字段会是null,用whereNull就能精准筛选出这些Job。

方案2:用whereNotExists(性能更优,适合大数据量)

如果你的tasks表数据很多,这种方法的查询效率会更高:

use Illuminate\Support\Facades\DB;

$jobs = Job::select('jobs.*')
    ->where('is_active', '=', 1)
    ->whereNotExists(function ($query) {
        $query->select(DB::raw(1))
            ->from('tasks')
            ->whereColumn('tasks.job_number', 'jobs.number');
    })
    ->get();

原理:这个查询的逻辑是——找出所有活跃的Job,且不存在任何一条Task记录的job_number和该Job的number匹配,直接从逻辑层面排除了有任务的Job。

方案3:用whereNotIn(注意边界情况)

这种方法适合场景简单的情况,但要注意如果tasks.job_number存在null值,需要额外过滤:

$jobs = Job::select('jobs.*')
    ->where('is_active', '=', 1)
    ->whereNotIn('number', function ($query) {
        $query->select('job_number')
            ->from('tasks')
            ->whereNotNull('job_number'); // 排除Task中job_number为null的情况
    })
    ->get();

原理:先从tasks表中取出所有已分配的Job编号,再筛选出不在这个列表里的活跃Job。

另外提一句:你原来的查询出现重复数据,是因为内连接会把每个Task和对应的Job进行配对,一个Job有多少个Task就会返回多少条重复的Job记录。如果以后需要获取有任务的Job但不想重复,可以在查询末尾加上->distinct()来去重。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:08:11