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

时间:2016-02-17 08:46:59

标签: php laravel laravel-5 eloquent relation

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

100% / $total_steps * $total_steps_completed

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

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

任务模型:

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

步骤模型:

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

TasksController:

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($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的总步数,这样我就可以执行计算并显示进度条。我想我应该在我的步骤模型中为这个或者一个范围添加一个函数。但我坚持这一点,所以任何指针都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

您可以使用"范围" laravel功能。 你可以在这里找到一些关于它的信息

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

您的Step模型基本上都有这种方法:

String dtStart = empDobTxt.getText().toString(); 
try {  

    Calendar calDtStart = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.EN_US);
    calDtStart.setTime(dtStart);

    Calendar nowDate = Calendar.getInstance();
    if(calDtStart.before(nowDate));
    {
        holder.empDobTxt.setTextColor(Color.RED);
    }  
} catch (ParseException e) {  
    // TODO Auto-generated catch block  
    e.printStackTrace();  
}

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

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

注意:为了使用范围,将步骤作为关系(通过添加双括号)非常重要。否则你会得到一个没有范围功能的简单集合。

答案 1 :(得分:2)

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

<强>任务

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

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

<强> TasksController

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

在您的视图中,您可以访问steps并同时计算completed_steps

查看

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