【发布时间】:2021-04-02 15:52:11
【问题描述】:
我有一个 CASE 原始语句,它为每一行生成一个状态。如果用户不想查看所有项目但特定集合,我想按此状态进行过滤。
$query = Device::leftJoin('devices_meters', 'devices_meters.device_id', '=', 'devices.id')
->leftJoin('device_measurements', 'device_measurements.device_id', '=', 'devices.id')
->select(
'devices.*',
DB::raw("
CASE
WHEN
devices.retired = false
AND devices.last_reported_utc_at > :dateFilter
AND SUM(device_measurements.flow) > 0
THEN 'active'
WHEN
devices.retired = false
AND devices.last_reported_utc_at > :dateFilter
AND SUM(device_measurements.flow) = 0
THEN 'online'
WHEN
devices.retired = false
AND devices.last_reported_utc_at <= :dateFilter
THEN 'offline'
WHEN
devices.retired = false
AND devices.serial_number IS NULL
THEN 'inactive'
WHEN
devices.retired = true
THEN 'retired'
END AS status,
MAX(devices_meters.activated_at) AS activated_at,
MAX(devices_meters.created_at) AS latest
"),
)
->setBindings(['dateFilter' => $dateFilter]);
->groupBy('devices.id', 'devices_meters.activated_at')
->orderBy('devices.installed_at', 'DESC')
->paginate($user->settings_pagination);
我试过了:
$query->where('status', '=', $status);
$query->having('status', '=', $status);
但是这些不起作用。我可以通过status 列过滤的方式是什么?
【问题讨论】:
标签: laravel postgresql eloquent