Определение состояния нескольких объектов коллекции

#laravel #laravel-5 #eloquent

#laravel #laravel-5 #красноречивый

Вопрос:

По сути, у меня есть модель отчета. Отчет имеет одну группу диаграмм, а в группе диаграмм может быть много диаграмм. По сути, мне нужно знать, когда отчет готов к просмотру, и это может произойти, когда хотя бы одна диаграмма была обработана.

Затем мне нужно знать, когда отчет готов к загрузке, и это когда все диаграммы для отчета были обработаны. Это моя базовая структура схемы с некоторыми столбцами, удаленными для сокращения кода.

 Schema::create('reports', function (Blueprint $table) {
    $table->id();

    $table->boolean('isSubmitted')->nullable()->default(false);
    $table->boolean('isViewable')->nullable()->default(false);
    $table->boolean('reportReady')->nullable()->default(false);
});

Schema::create('chart_group', function (Blueprint $table) {
    $table->id();
    $table->foreignId('report_id');

    $table->foreign('report_id')
        ->references('id')
        ->on('reports')
        ->onDelete('cascade');
});

Schema::create('charts', function (Blueprint $table) {
    $table->id();
    $table->string('chart_name')->nullable();
    $table->boolean('chart_processed')->default(false);
    $table->foreignId('chart_group_id');

    $table->foreign('chart_group_id')
        ->references('id')
        ->on('chart_group')
        ->onDelete('cascade');
});
 

А затем в рамках задания Laravel я получаю все отчеты и зацикливаю их. Затем я проверяю диаграммы на наличие отчета, и если он не был обработан, я его обрабатываю. Если обработка прошла успешно, я обновляю диаграмму и помечаю ее как обработанную (другой код).

 foreach ($reports as $report) {
    foreach ($report->chartGroup->chart as $chart) {
        if (!$chart->report_processed) {
            if ($this->queryStatus($chart)) {
                if (!$report->isViewable) {
                    $report->isViewable = true;
                    $report->saveOrFail();
                }
            }
        }
    }
}
 

Итак, пока это работает нормально, если в отчете есть диаграмма, которая нуждается в обработке, она обрабатывается, и эта диаграмма помечается как таковая. Проблема, с которой я сталкиваюсь, заключается в следующем. Отчет может содержать 5 диаграмм. Мне нужен способ определить, когда все диаграммы были обработаны, чтобы я мог пометить отчет как готовый.

Как я мог это сделать?

Спасибо

Ответ №1:

Ну, вы можете запустить другое задание для определения отчетов, в которых все диаграммы были обработаны, как показано ниже.

Что я здесь делаю, так это просто проверяю

доступное количество диаграмм для отчета, а затем проверьте, совпадает ли это количество с отображаемым истинным количеством для этого отчета.

Это означает, что все диаграммы были обработаны.Если эти подсчеты совпадают, я добавляю отчет в пустую коллекцию. Наконец, вы можете обрабатывать $reports_to_be_downloaded коллекцию по своему усмотрению.

 $reports_to_be_downloaded = collect();

foreach ($reports as $report) {
  if($report->chartGroup->chart->count() == $report->chartGroup->chart()->where('isViewable',true)->count()){
    $reports_to_be_downloaded->add($report);
  } 
}