Laravel Eloquent запрос / подзапрос без значений выдает ошибку - PullRequest
0 голосов
/ 25 февраля 2020

Все мои департаменты должны представлять различные отчеты каждый квартал: бюджет, отдел кадров и т. Д. c. Я хочу показать таблицу, в которой показаны все необходимые отчеты для отдела вошедшего в систему пользователя (все отделы должны представлять одинаковые отчеты), логическое значение, если они его отправили, и логическое значение, если этот файл считается действительным. У меня проблемы в основном с логическими значениями.

У меня есть три таблицы: reports хранит id, name и due_date; file_uploads хранит id, report_id, filename и department_id; file_upload_errors хранит id, file_upload_id и error.

Чтобы создать таблицу для отображения пользователю, я запросил таблицу отчетов:

$data = Reports::with([
    'file_uploads' => function ($query) {
        $query->where('department_id', '=', user()->department_id);
    },
    'file_uploads.file_upload_errors'
])->get();

Далее мне нужно сопоставить данные с моделью моего вида:

$vm = array();
//map the data to the view model
foreach ($data as $value) {
    $mapping = new DataRequestsViewModel();
    $mapping->ReportName = $value->name;
    $mapping->DueDate = $value->due_date;
    $mapping->IsUploaded = ($value->file_uploads->count() > 0) ? true : false;
    $mapping->IsValid = ($value->file_uploads->file_upload_errors->count() < 1) ? true : false;
    $vm[] = $mapping;
}

Однако я получаю исключение: Property [file_upload_errors] does not exist on this collection instance.

Я понимаю, что это потому, что если пользователь еще не загрузил файл, поэтому он не может запросить отношение null, чтобы увидеть, есть ли какие-либо file_upload_errors, но я не знаю, как с этим справиться ... Может кто-нибудь показать мне хороший подход?


На самом деле я не использовал empty(), когда все сказано и сделано, но это действительно привело меня на правильный путь ... вот что я закончил:

foreach ($data as $value) {
            $mapping = new DataRequestsViewModel();
            $mapping->TemplateId = $value->id;
            $mapping->TemplateName = $value->name;
            $mapping->DueDate = $value->due_date;
            $mapping->IsUploaded = ($value->file_uploads->count() > 0) ? true : false;
            if ($mapping->IsUploaded == false) {
                $mapping->IsValid = false;
            } else {
                $mapping->IsValid = $value->file_uploads->first()->file_upload_errors->count() < 1 ? true : false;
            }
            $vm[] = $mapping;
        }

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Я полностью догадываюсь здесь, но я думаю, что из-за того, что вы делаете пользовательский запрос к вашему file_uploads, вы фактически теряете встроенное отображение file_uploads.file_upload_errors.

Перемещение with внутри запроса file_uploads, он будет правильно добавлен в эту коллекцию.

Возможно, это будет работать:

$data = Reports::with([
    'file_uploads' => function ($query) {
        $query->where('department_id', '=', user()->department_id)
        ->with('file_upload_errors');
    },
])->get();
0 голосов
/ 25 февраля 2020

Вы не справитесь с этим :) Если ошибок нет, то их не нужно считать. Я бы использовал это вместо:

$mapping->IsValid = empty($value->file_uploads->file_upload_errors) ? true : false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...