Laravel / Eloquent:查询belongsTo / hasMany关系

时间:2015-09-24 17:41:16

标签: sql laravel-5 eloquent

我有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文档并找到了“查询关系存在”,但我找不到如何查询不存在。

我该怎么办(我希望我足够清楚)? 非常感谢你,我被卡住了!

2 个答案:

答案 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