Eloquent получает значение, подобное имени столбца?

#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, ты прав насчет документации, первый параметр — это имя столбца, поэтому я предположил, что могу передать значение, подобное имени столбца. Вы работаете с кодом.