Laravel: Сравнение дат между двумя столбцами в базе данных не работает - PullRequest
2 голосов
/ 04 октября 2019

Мы пытаемся построить и API с нашим проектом. Моя проблема в том, что когда мне нужно получить конкретное событие, которое имеет столбцы date_from и date_to, оно всегда получает данные, даже если событие было завершено. Я хочу получить конкретное событие, которое было для оставшихся двух дат. Моя вещь, когда date_from и date_to равны или больше, чем сегодняшняя дата, Это покажет, а после того, как дата закончится, не будет. Вот некоторые из моих кодов.

Индекс

 public function index(Request $request)
    {
        $person = User::find(Auth::user()->id); 
        $now = Carbon::now()->toDateString();
        if(empty($person))
            return response()->json([
                'code' => '03',
                'status' => 'Invalid User'
            ], 403);
        $role = $person->role;
        if ($role == 2 || $role == 3) {
            $level = Event::active()->with(['groups'])
            ->where('school_id', '=', $person->school_id)
            ->where('group_id', '=', $role)
            ->orWhere('group_id', '=', $person)
            ->where('status', '=', 1)
            ->where('active', '=', 1)
            ->whereRaw("date_from <=  date('$now')")
            ->whereRaw("date_to >=  date('$now')")

            ->get();


            return response()->json($level);
        }

Результат в почтальоне

{
        "id": 1,
        "name": "Final",
        "content": "<p>Sample</p>",
        "group_id": 2,
        "event_date": "2019-09-01", 
        "date_from": "2019-09-20", //sept 20, 2019. The event started
        "date_to": "2019-10-03",//oct, 3 2019. The event end date. still gets the data even the date was not today.
        "time_from": "16:15:00",
        "time_to": "22:15:00",
        "event_place": "Room",
        "image": "",
        "school_id": 1,
        "smsnotify": 0,
        "appnotify": 1,
        "status": 1,
        "active": 1,
        "updated_by": null,
        "created_at": "2019-09-27 08:29:13",
        "updated_at": "2019-10-04 06:18:43",
        "users_id": 2,
        "groups": {
            "id": 2,
            "name": "Teachers",
            "description": "Teachers",
            "updated_by": null,
            "created_at": null,
            "updated_at": null
        }
    }

Ответы [ 4 ]

2 голосов
/ 04 октября 2019

Переменная $now, как вы ее определили, уже должна быть компонентом только даты для текущей отметки времени. Поэтому не должно быть никаких причин не использовать регулярные where():

$now = Carbon::now()->toDateString();

$level = Event::active()->with(['groups'])
    ->where('school_id', '=', $person->school_id)
    ->whereIn('group_id', [$role, $person])
    ->where('status', '=', 1)
    ->where('active', '=', 1)
    ->where('date_from', '<', $now)
    ->where('date_to', '>=', $now->addDays(1))

. Я предполагаю в своем ответе, что вы хотите избежать сегодня. Логика для этого заключается в том, что дата раньше, чем сегодняшняя дата в полночь, или в полночь завтрашнего дня или после нее.

Помимо выпуска даты, вы обрабатываете group_id, используя where() и orWhere()возможно, вызывает проблемы. Ваше намерение в SQL заключается в следующем:

WHERE (group_id = $role OR group_id = $person)

Обратите внимание на круглые скобки. Но, как вы и написали, из-за порядка операций все может получиться не так, как вы хотели.

1 голос
/ 04 октября 2019

Ваша дата углерода должна соответствовать формату, установленному на вашем сервере баз данных

$now = Carbon::now()->toDateString()->format('Database Format');

Кроме того, вам не нужно передавать переменную даты в функции даты

 ->where('date_from', '<', $now)
1 голос
/ 04 октября 2019

Попробуйте

$level = Event::active()->with(['groups'])
  ->where('school_id', '=', $person->school_id)
  ->whereIn('group_id', [$person,$role])
  ->where('status', '=', 1)
  ->where('active', '=', 1)
  ->where('date_from', '<=', $now)
  ->where('date_to', '>=', $now->addDays(1))
  ->get();
1 голос
/ 04 октября 2019

Попробуйте это.

$level = Event::active()->with(['groups'])
            ->where([['school_id', '=', $person->school_id],['group_id', '=', $role],['status', '=', 1],['active', '=', 1]])
            ->orWhere('group_id', '=', $person)
            ->whereRaw("CURDATE() between date_from and date_to")
            ->get();
...