Как добавить результаты запроса коллекции Laravel

#laravel #laravel-collection

Вопрос:

У меня есть запрос ниже:

 $controls_checklists = collect();

foreach($active_evaluation_session->evaluation_items as $evaluation_item) {
    $controls_checklists->push(ControlsChecklist::where('macro_process_id', $evaluation_item->macro_process_id)
        ->where('process_id', 'like', $evaluation_item->process_id ? $evaluation_item->process_id : '%')
        ->where('status', 1)->get());
}

$controls_checklists->all();


return view('auto-evaluations.index', compact('controls_checklists'));
 

На мой взгляд, у меня есть:

 @foreach ($controls_checklists as $controls_checklist)
<tr data-entry-id="{{ $controls_checklist->id }}">
    <td></td>
    <td>{{ $controls_checklist->control->control_reference }}</td>
    <td>{{ $controls_checklist->macro_process->name }}</td>
    <td>{{ $controls_checklist->process->name }}</td>
    <td>{{ isset($controls_checklist->sub_process->name)? $controls_checklist->sub_process->name: '' }}</td>
    <td>{{ isset($controls_checklist->activity->name)? $controls_checklist->activity->name: '' }}</td>
    <td>{{ $controls_checklist->checkpoint }}</td>
    <td>
        @if($controls_checklist->status == 1) {{ 'Active' }} @else {{ 'In Active' }} @endif
    </td>

    <td>
        <a href="{{ route('controls-checklists.edit',[$controls_checklist->id]) }}" class="btn btn-xs btn-info">@lang('global.app_evaluate')</a>
    </td>
</tr>
@endforeach
 

Однако, когда я открываю страницу, я получаю сообщение об ошибке

 Property [id] does not exist on this collection instance. (View: /opt/lampp/htdocs/controls-assessment/resources/views/auto-evaluations/index.blade.php) 
 

Для этой строки

 <tr data-entry-id="{{ $controls_checklist->id }}">
 

Я думаю, что это не работает из-за того, как я пытаюсь объединить запрос коллекций выше. Как я могу это решить?

Ответ №1:

Вы правы, что push() это не тот способ, чтобы добавлять две коллекции вместе, используйте concat() вместо этого.

Для вашего кода замените push() на concat() и назначьте результат той же переменной.

 $controls_checklists = $controls_checklists->concat(
    ControlsChecklist::where('macro_process_id', $evaluation_item->macro_process_id)
        ->where('process_id', 'like', $evaluation_item->process_id ? $evaluation_item->process_id : '%')
        ->where('status', 1)
        ->get()
);
 

Комментарии:

1. Спасибо @anurat-chapanond. Ваши ответы работают, даже если моя среда разработки выдает сообщение Expected illuminateSupportiterable, got illuminateDatabaseEloquentCollection|Static[] для запроса внутри concat. Не знаю, почему

2. @FokwaBest ну, коллекция на самом деле реализует итерацию, так что она все еще действительна. Какова ваша IDE?

3. а ну понятно. Я использую PhpStorm

Ответ №2:

Сначала dd($controls_checklist); и убедитесь, что на месте $controls_checklist->id идентификатора действительно существует. Если нет, измените оператор цикла foreach.

Перейдя к циклу foreach, попробуйте использовать модель с соединением или внутренним соединением для управления результатом запроса

Спасибо

Ответ №3:

Вам не удастся выполнить цикл, потому что ваша переменная возвращает коллекцию коллекций.

если хочешь, можешь попробовать это.

 foreach($active_evaluation_session->evaluation_items as $evaluation_item) {
   $controlsChecklist = ControlsChecklist::where('macro_process_id', $evaluation_item->macro_process_id)
            ->where('process_id', 'like', $evaluation_item->process_id ? $evaluation_item->process_id : '%')
            ->where('status', 1)->get();
   foreach ($controlsChecklist as $value) {
     $controls_checklists->push($value);
  }
}
 

Ответ №4:

вам не нужно собирать данные в новой переменной коллекции.

попробуйте это:

 $query = ControlsChecklist::query();

foreach($active_evaluation_session->evaluation_items as $evaluation_item) {
    $query->where('macro_process_id', $evaluation_item->macro_process_id)
        ->where('process_id', 'like', $evaluation_item->process_id ? $evaluation_item->process_id : '%')
        ->where('status', 1);
}

return $query->get();