Laravel Запросить записи последовательно? - PullRequest
0 голосов
/ 04 апреля 2020

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

Запись 1:
Дата создания: 05.04.2020;
Должность: старший разработчик программного обеспечения;
Офис: Нью-Йорк

Запись 2:
Дата создания: 03.04.2020;
Должность: старший разработчик программного обеспечения;
Офис: новое Йорк

Запись 3:
Дата создания: 01/04/2020;
Должность: Старший разработчик программного обеспечения;
Офис: Нью-Йорк

Запись 4:
Дата создания: 31.032020;
Должность: младший разработчик программного обеспечения;
Офис: Нью-Йорк

Запись 5:
Дата создания: 24/03/2020;
Название : Старший разработчик программного обеспечения;
Офис: Токио

Я хочу создать запрос, который берет "Заголовок" последней записи и последовательно поисков в обратном порядке, по дате, для всех записей: до , где «Заголовок» не изменился.

Таким образом, в приведенном выше примере он должен возвращать записи 1, 2 и 3, но не более того. Так что не записывайте 4 или 5.

Любые идеи о том, как этого добиться, используя eloquent.

Я только начал, но я не уверен, что делать дальше.

Employee::where('employee_id',$employee_record->employee_id)->orderBy('created_at', 'desc')->get();

Заранее спасибо,

Сачин

Ответы [ 3 ]

0 голосов
/ 06 апреля 2020

Вы должны сделать это с помощью встроенных в 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, если он различен.

0 голосов
/ 06 апреля 2020

Спасибо за помощь выше. Я закончил этим вчера, и это, похоже, сработало.

Не уверен, что есть способ улучшить / сжать синтаксис, но он работает.

    // 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[] = $existing_records->first();

    foreach($existing_records as $record) {
    $previous_record = Employee::where([['employee_id', $record->employee_id], ['created_at', '<', $record->created_at]])
                                ->orderBy('created_at', 'desc')
                                ->first();
        if ($previous_record != null) {
            $job_grade = $record->job_grade;
            $office_name = $record->office_name;
            $previous_job_grade = $previous_record->job_grade;
            $previous_office_name = $previous_record->office_name;
            if ($job_grade == $previous_job_grade && $office_name == $previous_office_name){
                array_push($record_set, $previous_record);
            }
            else {
                break;
            }
        }
        else {
            break;  
        }                         
    }
    return $record_set;
}
0 голосов
/ 04 апреля 2020

Сначала вам нужно получить заголовок, а после этого вернуть вам набор данных, таких как title = "Senior" и вернуть запись 1 2 4 и 5, потому что вам нужен последовательный поиск, вы можете вернуть запрос с этим

$employees = Employee::where("title", Your_title); // this return query

и дату поиска с:

$employees = $employees->orWhere("date", "> or < or ...", your_date);

и может использовать get для получения данных, которые вы искали с:

return $employees->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...