Laravel/Eloquent:查询belongsTo / hasMany关系

3
我有两个表:tasks和executions。一个任务“hasMany”执行(而一个执行“belongsTo”一个任务)。
tasks表中的字段:id(主键),name,data,created_at等等。 executions表中的字段:id(主键),process_name,created_at,task_id。
我想要获取最旧的任务(基于tasks.created_at),它:
- 从未被执行过(没有在executions表中记录任务id作为task_id), 或 - 被任何其他进程执行过,但不是"MyProcess" => executions.process_name <> 'MyProcess'
我阅读了Eloquent文档并找到了“查询关系存在性”,但我找不到如何查询不存在的内容。
我应该怎么做(希望我已经足够清楚了)? 非常感谢您的帮助,我被卡住了!
2个回答

3

首先,您应该建立起自己的关系:

class Task extends Model {
    public function executions() {
        return $this->hasMany(Execution::class);
    }
}

class Execution extends Model {
    public function task() {
        return $this->belongsTo(Task::class);
    }
}

那么你的查询应该是:
$task = Task::doesntHave('executions')
            ->orWhereHas('executions', function($query) use ($name) {
                return $query->where('process_name', '<>', $name);
            })
            ->oldest()
            ->first();

当然,你可以将这些查询语句封装在查询作用域中。

非常感谢!这正是我正在寻找的。 - Alexis Romot

0

请尝试以下方法:

SELECT t.* FROM tasks t 
LEFT JOIN executions e 
ON e.task_id = t.id AND e.process_name = 'MyProcess'
WHERE e.task_id IS NULL
ORDER BY t.create_at LIMIT 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接