如何在 Laravel 中的单列上使用带有两个条件的 orWhere

How to use orWhere with two conditions on single column in Laravel

我正在尝试在 Laravel 5.5 上构建一个小型应用程序,其中我有一个名为 MilestoneTask 的模型。 Task 有一个名为 status 的列,status 是 table 和 ['open', 'closed', 'accepted', 'sent'] 中的 enum 属性列,我想获取所有task 特别涉及 Milestone,它与 status: - acceptedsent 有任务,以下是我的模型:

任务

public function milestone()
{
    return $this->belongsTo('App\Models\Team\Milestone', 'milestone_id');
}

在我的控制器中,我正在尝试这样的事情:

$completedTask = Task::whereHas('milestone', function ($q) use($id) {
    $q->where('unique_id', $id)->orWhere('status', ['Sent', 'Accepted']);
})->count();

orWhere 子句还提供其他里程碑 table 数据。

帮我解决这个问题。谢谢。

I want to fetch all the Milestone which has task with status: - accepted and sent. Task is having a column named status

你应该使用 orWhereIn():

Milestone::whereHas('tasks', function ($q) use($id) {
        $q->where('unique_id', $id)->orWhereIn('status', ['Sent', 'Accepted']);
    })
    ->get();

您想获得里程碑,您在 Task 模型中说 status。这就是为什么您需要使用 Milestone 模型和 tasks 关系。此外,如果您想获取里程碑而不计算里程碑,请使用 get() 而不是 count()

要获取 unique_id 等于某些 $id 且相关任务状态可以被接受或发送的里程碑,您可以将此数据获取为

$milestones= Milestone::with(['tasks' => function ($query) {
    $query->whereIn('status', ['sent', 'accepted']);
}])
->where('unique_id', $id)
->get();

或获取任务

$tasks = Task::with(['milestone' => function ($query) use($id) {
    $query->where('unique_id', $id);
}])
->whereIn('status', ['sent', 'accepted'])
->get();

我认为您的代码应该是这样的,以获取具有 unique_id == $id 和(status = Sent 或 status == Accepted)

的任务
$completedTask = Task::whereHas('milestone', function ($q) use($id) {
    $q->where('unique_id', $id)->where(function ($query) {
        $query->where('status', 'Sent')
            ->orWhere('status', 'Accepted');
    })
})->count();
Milestone::whereHas('tasks', function ($q) use($id) {

    $q->where('unique_id', $id)
      ->whereIn('status', ['Sent', 'Accepted']);

})->get();

orWhere & orWhereIn 会给你 OR 条件语句, 您应该在两个地方都使用 where 来获得 AND 条件...