Laravel Eloquent сравнить даты по конкретному формату - PullRequest
0 голосов
/ 30 апреля 2018

У меня небольшая проблема со сравнением дат в Laravel, где дата имеет определенный формат. Поле в базе данных имеет дату, подобную этой d-m-Y(20-04-2018), и я пытаюсь получить результат, где эта дата больше, чем дата, использующая эту дату.

$check= Usersubstitutions::where([
   ['user_id', '=', $request->user],
   ['date_to', '>=', date("d-m-Y")]
])->first();

И это никогда не работает. Я сделал сброс, чтобы посмотреть, что сравнивается, используя foreach, и он говорит, что 20-05-2018 НЕ больше, чем 04-04-2018.

Ответы [ 4 ]

0 голосов
/ 30 апреля 2018

Вы, похоже, храните ДАТУ в поле varchar. Это не очень хорошая идея. Вам необходимо либо заново создать таблицу и сохранить date_to в качестве даты, используя стандартный формат SQL DATE (и использовать формат Y-m-d при вставке), либо привести столбец к дате при выборе:

$check= Usersubstitutions::where([
  ['user_id', '=', $request->user],
  [\DB::raw("STR_TO_DATE(date_to,'%d-%m-%Y')")  ', '>=', date("Y-m-d")]
])->first();

Обратите внимание, что это сделает любые индексы бесполезными и заставит запрос выполняться очень (очень) медленно.

Примечание: STR_TO_TIME - это только MySQL, но есть эквиваленты в других СУБД, например. в SQL Server это выглядит как CONVERT(DATE, date_to, 105)

0 голосов
/ 30 апреля 2018

Поскольку ваше поле является varchar, попробуйте сначала привести его к DATE, а затем сравнить с date('d-m-Y'), например:

$check= Usersubstitutions::where('user_id', $request->user)
    ->where(DB::raw("DATE(date_to) >= '".date('d-m-Y')."'"))
    ->first();

ПРИМЕЧАНИЕ: Будет лучше преобразовать тип поля в вашей базе данных в 'DATE'.

0 голосов
/ 30 апреля 2018

Преобразуйте ваш столбец в формат даты, например DATE, и тогда он будет работать как положено.

0 голосов
/ 30 апреля 2018

На Laravel 4+ вы можете использовать

->whereDate('date_to', '>=', date("d-m-Y")

Дополнительные примеры см. В первом сообщении # 3946 и этой статье Laravel Daily .

но вы также можете использовать -> где () как более удобное.

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

$dayAfter = (new date()->modify('+1 day')->format('d-m-Y');

->where('date_to', '>=', $dayAfter)

Надеюсь, это поможет. если нет, просмотрите это qn для дальнейших объяснений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...