Вы должны сделать это с помощью встроенных в Laravel методов Collection.
После выполнения запроса:
$employees = Employee::where('employee_id',$employee_record->employee_id)->orderBy('created_at', 'desc')->get();
$employees
получит коллекцию, возвращаемую Laravel (Я включаю только заголовок столбца в этом примере):
[
{title: "Senior Software Developer"},
{title: "Senior Software Developer"},
{title: "Senior Software Developer"},
{title: "Junior Software Developer"},
{title: "Senior Software Developer"},
]
Сначала мы берем первый элемент. Нам также понадобится еще одна пустая коллекция, чтобы выбрать отфильтрованные элементы:
$first = $employees->first();
$filtered = collect([]);
Теперь мы повторяем и помещаем sh каждый элемент в коллекцию отфильтрованных массивов, пока не изменится имя (по сравнению с $first
). .
$employees->each(function($item, $key) use($filtered, $first) {
if($item->title != $first->title)
{
// Stops the loop when title changes
return false;
}
// Title hasn't changed.. push
$filtered->push($item);
});
Обратите внимание на use($filtered, $first)
для передачи переменных внутри обратного вызова l oop.
Наконец, у вас будет:
[
{title: "Senior Software Developer"},
{title: "Senior Software Developer"},
{title: "Senior Software Developer"},
]
И вы можете использовать $ фильтрованный объект, как обычно.
Я надеюсь, что это помогло направить вас в правильном направлении. В общем, Laravel Методы сбора являются правильным способом обработки результатов запроса.
Документация: https://laravel.com/docs/6.x/collections#method -each
РЕДАКТИРОВАТЬ
Основываясь на коде, которым вы поделились с нами, в случае, если вы хотите создать этот лог c, вы можете использовать сокращение в foreach (нет необходимости в дополнительной базе данных запросов внутри de l oop)
// Find all records for this employee
$existing_records = Employee::where([['employee_id', $request->employee_id],['created_at', '<=', $request->created_at]])
->orderBy('created_at', 'desc')
->get();
// Find complete record set for where there has been no change in the Employee's Job Grade, or Office
$record_set = [];
$first = $existing_records->first();
foreach($existing_records as $record) {
if ($record->job_grade == $first->job_grade && $record->office_name == $first->office_name) {
array_push($record_set, $record);
}
else
{
break;
}
}
Я думаю, что таким образом вы получите тот же массив ... но с большей читабельностью и меньшим количеством кода. Как вы думаете?
В английском sh foreach l oop говорит: если job_grade
и office_name
одинаковы для элемента first
, то pu sh это массив $record_set
... разбивает l oop, если он различен.