У меня есть модель задачи и модель шага. Каждая задача может иметь несколько этапов. Я хочу иметь возможность отображать все задачи, включая индикатор выполнения. Длина индикатора выполнения будет рассчитываться по общему количеству шагов и выполненных шагов. Поэтому я сделаю расчет, как:
100% / $total_steps * $total_steps_completed
Шаг, который был выполнен, имеет статус в базе данных, установленный на 1. Я знаю, как получить $ total_steps. Я просто делаю подсчет ($ task-> steps), чтобы он подсчитывал общее количество строк в массиве.
Но как я могу посчитать шаги, которые имеют статус 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:
@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);;
}
Затем вы можете получить свои задачи вместе с шагами и завершенными шагами:
TasksController
$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/
Вы бы в основном имели этот метод на своей модели Step:
class Step extends Model
{
public function scopeDone($query)
{
return $query->where('status', 1);
}
}
Тогда вы сможете выполнить следующие шаги:
Total Steps: {{ $task->steps()->done()->count() }}
Примечание. Чтобы использовать области действия, важно получить свои шаги в виде взаимосвязи (добавив двойные скобки). В противном случае вы получили бы простую коллекцию без возможностей области.