Laravel Query Builder для сравнения времени и сортировки - PullRequest
1 голос
/ 05 апреля 2020

У меня есть две таблицы

courses [ id, nsu_id, course, section, class_start, class_end ] and 

orders [ id, nsu_id]

В курсы таблица имеет несколько курсов и время class_start.

  • Я хочу сравнить между class_start и текущим временем.

  • Если время class_start больше чем текущее время, то я сохраню первое время class_start для отдельного nsu_id, так как [nsu_id] имеет многократное время class_start [ Самое важное ].

  • И затем сортировка время начала класса.

Чтобы решить эту проблему, это то, что я сделал с контроллером.

public function xyz()
{

    $time = new DateTime('now', new DateTimezone('Asia/Dhaka'));
    $now=$time->format('H:i a');
    $courses=Course::join('orders', 'orders.nsu_id', '=', 'courses.nsu_id')
         ->select('orders.*','courses.class_start')
         ->where('class_start', '>', $now)
         ->orderBy('class_start', 'ASC')
         ->get();

    return view('xyz',compact('courses'));
}

И я получаю такой результат

enter image description here

[ Проблемы: ]

  1. Неправильно отсортирована синхронизация Class_start.
  2. У того же nsu_id многократное время class_start.

Итак, есть ли логический способ решить эту проблему?

1 Ответ

1 голос
/ 05 апреля 2020

Вы можете group by заказать и выбрать минимальное время начала с помощью MIN


    $courses = Course::join('orders', 'orders.nsu_id', '=', 'courses.nsu_id')
    ->select('orders.nsu_id', DB::raw('MIN(courses.class_start) AS class_start'))
    ->where('courses.class_start', '>', $now)
    ->groupBy('orders.nsu_id')
    ->get();

Редактировать:

Поскольку class_start является строкой, время составляет 12 часов Формат AM или PM.

Вы можете использовать STR_TO_DATE() для преобразования строки в datetime, а затем получить минимальное время:

->select('orders.nsu_id', DB::raw("DATE_FORMAT(MIN(STR_TO_DATE(CONCAT('2020-04-05 ', class_start), '%Y-%m-%d %h:%i %p')), '%h:%i %p') AS class_start"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...