雄辩的人收到像列名这样的值吗?

时间:2019-03-23 21:54:10

标签: php laravel-5 orm eloquent mariadb

我在Laravel Eloquent中有以下模型:

<?php

namespace Sac\Models;

use Illuminate\Database\Eloquent\Model 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`
)

但是雄辩地构建:

SELECT * 
FROM `patients_devices` 
WHERE 
(
    `monitor` = 1 AND 
    `2019-03-23 13:11:48` BETWEEN `start_date_time` AND `end_date_time`
)

在(where)条件中的(')和(`)(反引号/反引号)差别不大,因为第一个识别为字符串,第二个识别为文字列名称。

在我的模型中,我有一个公共方法,可以使用以下条件检索数据收集:监视值为1且 两个datetime列(开始和结束)之间存在一个时间戳。

我的问题:我被迫使用模型,并且看到我使用了whereBetween方法,在将$currrentDateTime识别为列的情况下应将其识别为值,因为在SQL中,我可以在没有限制的子句上使用列和值的位置。

这是Eloquent的限制吗?还是我正在以错误的方式开发逻辑SQL?我可以使用模型以其他方式解决它吗?

1 个答案:

答案 0 :(得分:2)

您不想在这些日期之间获取条目吗?

self::where('monitor', '=', 1)
    ->where('start_date_time', '<=', $currentDateTime)
    ->where('end_date_time', '>=', $currentDateTime)
    ->get();

如果您想使用whereBetween(),则语法为->whereBetween('column', [values]),因此我怀疑它是否适合您的情况。