Laravel получить счетчик отношений, где для поля в базе данных установлено определенное значение

У меня есть модель задачи и модель шага. Каждая задача может иметь несколько этапов. Я хочу иметь возможность отображать все задачи, включая индикатор выполнения. Длина индикатора выполнения будет рассчитываться по общему количеству шагов и выполненных шагов. Поэтому я сделаю расчет, как:

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, поэтому я могу выполнить свой расчет и отобразить индикатор выполнения. Я думаю, что я должен добавить функцию для этого, или, возможно, область действия, в моей модели шагов. Но я застрял с этим, поэтому любые указатели будут оценены.

3

Решение

Вы можете добавить отношение с условием, чтобы вернуть все выполненные шаги для задачи:

задача

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() );
2

Другие решения

Вы можете использовать функцию «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() }}

Примечание. Чтобы использовать области действия, важно получить свои шаги в виде взаимосвязи (добавив двойные скобки). В противном случае вы получили бы простую коллекцию без возможностей области.

2

По вопросам рекламы [email protected]