Laravel获取关系计数,其中数据库中的字段设置为特定值


Laravel get relation count where a field in the database is set to a certain value

我有一个任务模型和一个步骤模型。每个任务可以有多个步骤。我希望能够显示所有任务,包括进度条。进度条的长度将由总步骤和完成的总步骤计算。所以我会做一个这样的计算:

100% / $total_steps * $total_steps_completed

已完成的步骤在数据库中的状态设置为 1。我知道如何获得$total_步骤。我只是做一个计数($task->步骤(,所以它会计算数组中的总行数。

但是,如何计算状态为 1 的步数呢?

任务模型:

class Task
{
    public function steps()
    {
        return $this->hasMany('App'Step');
    }
}

步骤模型:

class Step
{
    public function task()
    {
        return $this->belongsTo('App'Task');
    }
}

任务控制器:

class TasksController
{
    public function index()
    {
        $tasks = User::find(Auth::user()->id)->tasks->with('steps')->get();
        return view('tasks', compact('tasks');
    }
}

每个任务都属于一个用户,因此User::find()->tasks等。

在我的steps表中,我有以下字段:

$table->integer('status');

这可以设置为 0 或 1。在我的任务 -> index.blade.php 视图中,我有一个简单的 foreach:

@foreach($tasks as $task)
    {!! $task->id !!} // This is 1 for example
    Total Steps: {!! count($task->steps) !!} // Returns 5 if there are 5 rows in the steps database with task_id `1` for example
@endforeach

现在,我需要的是计算其状态设置为 1 的总步数,以便我可以执行计算并显示进度条。我想我应该在我的步骤模型中为此添加一个函数,或者可能添加一个范围。但是我被困住了,所以任何指示都将不胜感激。

您可以添加带有条件的关系,以返回任务的所有已完成步骤:

任务

public function completedSteps()
{
    return $this->hasMany('App'Step')->where('status','=', 1);;
}

然后,您可以获取任务以及步骤和已完成的步骤:

任务控制器

$tasks = User::find(Auth::user()->id)->tasks->with('steps', 'completed_steps')->get();

在您看来,您可以访问steps并同时计算completed_steps

视图

count( $task->completedSteps()->get() );

您可以使用"scope"laravel功能。您可以在此处找到有关它的一些信息

http://www.easylaravelbook.com/blog/2015/06/23/using-scopes-with-laravel-5/

您基本上可以在步骤模型上使用此方法:

class Step extends Model
{
    public function scopeDone($query)
    {
        return $query->where('status', 1);
    }
}

然后,您应该能够通过以下方式完成这些步骤:

Total Steps: {{ $task->steps()->done()->count() }}

注意:要使用范围,请务必将步骤作为关系获取(通过添加双括号(。否则,您将获得一个没有作用域功能的简单集合。