如何在Laravel

时间:2018-01-11 06:50:03

标签: php laravel laravel-5 laravel-5.5 laravel-eloquent

我正在尝试在Laravel 5.5上构建一个小应用程序,我的模型名为MilestoneTaskTask有一个名为status的列,statusenum属性列,表格中包含['open', 'closed', 'accepted', 'sent'],我想要获取所有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子句还提供其他里程碑表数据。

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

4 个答案:

答案 0 :(得分:1)

要获得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();

答案 1 :(得分:1)

我认为你的代码应该是这样的,以获得具有unique_id == $ id和(status =已发送或状态==已接受)的任务

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

答案 2 :(得分:0)

  

我想获取所有具有状态任务的里程碑: - 已接受并已发送。任务有一个名为status

的列

您应该使用orWhereIn()

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

您希望获得里程碑,并在status模型中说Task。这就是您需要使用Milestone模型和tasks关系的原因。此外,如果您想要获取里程碑而不计算里程碑,请使用get()代替count()

答案 3 :(得分:0)

Milestone::whereHas('tasks', function ($q) use($id) {

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

})->get();

或者& orWhereIn 会为您提供 OR 条件声明, 你应该在两个地方使用哪里来获得 AND 条件......