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