#php #laravel-5 #orm #eloquent #mariadb
#php #laravel-5 #orm #eloquent #mariadb
Вопрос:
У меня есть следующая модель в Laravel Eloquent
:
<?php
namespace SacModels;
use IlluminateDatabaseEloquentModel as Eloquent;
class PatientsDevices extends Eloquent
{
...
public static function getDevicesByDateTime()
{
$currrentDateTime = (new DateTime('now', new DateTimeZone('America/Costa_Rica')))->format('Y-m-d H:i:s');
return self::where('monitor', '=', 1)
->whereBetween($currrentDateTime, ['start_date_time', 'end_date_time'])
->get();
}
...
}
С помощью этого я пытаюсь построить следующее предложение SQL:
SELECT *
FROM `patients_devices`
WHERE
(
`monitor` = 1 AND
'2019-03-23 13:11:48' BETWEEN `start_date_time` AND `end_date_time`
)
Но вместо этого Eloquent создает:
SELECT *
FROM `patients_devices`
WHERE
(
`monitor` = 1 AND
`2019-03-23 13:11:48` BETWEEN `start_date_time` AND `end_date_time`
)
Небольшая разница заключается в том, что (‘) и (`) (обратная кавычка / backtick) относятся к условию where, поскольку первое распознается как строка, а второе — как буквальное имя столбца.
В моей модели у меня есть общедоступный метод, который возвращает запрос к сбору данных с этими условиями: значение монитора равно 1, а временная метка существует между двумя столбцами datetime (начало и конец).
Моя проблема: я вынужден использовать модели, и я вижу, что я использую whereBetween
метод, распознающий $currrentDateTime
like как столбец, когда должен распознавать как значение, поскольку в SQL я могу использовать столбцы и позиции значений в предложении, где ограничиваются whitout.
Это Eloquent
ограничение? или я неправильно развиваю логику SQL?. Я могу решить это другим способом, используя модели?
Ответ №1:
Разве вы не хотите получать записи между этими датами?
self::where('monitor', '=', 1)
->where('start_date_time', '<=', $currentDateTime)
->where('end_date_time', '>=', $currentDateTime)
->get();
Если вы хотите использовать whereBetween()
, синтаксис ->whereBetween('column', [values])
такой, поэтому я сомневаюсь, что он подходит в вашем случае.
Комментарии:
1. Спасибо @senty, ты прав насчет документации, первый параметр — это имя столбца, поэтому я предположил, что могу передать значение, подобное имени столбца. Вы работаете с кодом.