我有2个表:任务和执行。 任务“hasMany”执行(以及执行“属于”任务)。
表任务中的字段:id (primary key), name, data, created_at, ...
表执行中的字段:id (primary key), process_name, created_at, task_id.
我想获得最旧的任务(基于 tasks.created_at ),其中,
- 从未执行过(没有记录表执行,任务ID为task_id),
或
- 已由任何其他流程执行,但“MyProcess”=> executions.process_name<> 'MyProcess'
我阅读了Eloquent文档并找到了“查询关系存在”,但我找不到如何查询不存在。
我该怎么办(我希望我足够清楚)? 非常感谢你,我被卡住了!
答案 0 :(得分:1)
首先你应该建立你的关系:
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();
当然,您可以将这些查询包装在查询范围内。
答案 1 :(得分: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