如何在 Eloquent 的帮助下选择超过 20 分钟且少于 30 分钟的行,并且没有原始 sql?



我有以下SQL查询(postgres是我的数据库(:

select distinct *
from "customers"
inner join "customer_events" on "customer_events"."customer_id" = "customers"."id"
inner join "customer_event_types" on "customer_events"."customer_event_type_id" = "customer_event_types"."id"
where "customer_event_types"."code" =  'Reg'
and (current_timestamp - customer_events.created_at) > (20 *  60 * '1 sec'::interval)
and (current_timestamp - customer_events.created_at) < (30 *  60 * '1 sec'::interval)

我认为从这个查询中理解我的业务逻辑并不难:我有客户,客户制作事件,每个事件都有事件类型。这很简单,但主要问题是获取存在超过 20 分钟且少于 30 分钟的特定事件的客户端。 这个请求对我有用(我相信我没有日期错误(。

如何在 Eloquent 的帮助下编写相同的内容,但没有原始 SQL。没有原始SQL可能吗?

我有这段代码,但它包含原始 SQL:

$tmp = DB::table('customers')->select('customers.idfa', 'customers.idfv', 'customers.app_build_number', 'customers.os_version', 'customers.model')->distinct()
->join('customer_events', 'customer_events.customer_id', '=', 'customers.id')
->join('customer_event_types', 'customer_events.customer_event_type_id', 'customer_event_types.id')
// event is my object, that contains event_code and time intervals
->when($events, function ($query, $events) {
foreach ($events as $event) {
if (!isset($event->event_code) || empty($event->event_code)) {
continue;
}
$query->where('customer_event_types.code', '=', $event->event_code);
if (isset($event->minutes_from) && !empty($event->minutes_from)) {
$query->whereRaw("(current_timestamp - customer_events.created_at) > ($event->minutes_from *  60 * '1 sec'::interval)");
}
if (isset($event->minutes_to) && !empty($event->minutes_to)) {
$query->whereRaw("(current_timestamp - customer_events.created_at) < ($event->minutes_to *  60 * '1 sec'::interval)");
}
}
return $query;
});

您可以为时间段 -30 分钟和 -20 分钟创建一个时间戳范围,并使用范围元素包含运算符 (<@(。在原始 sql 中,这将是

where event_date <@ tsrange ( localtimestamp - interval '30 min', localtimestamp - interval '20 min', '()')  

我不熟悉必要的 Eloquent 语法,但从您的帖子推断,以下内容似乎是可行的

$query->whereRaw("$event <@ tsrange (localtimestamp - interval '30 min', localtimestamp - interval '20 min', '()')");

最新更新