laravel - 带有计算列的 Laravel Eloquent `have`
问题描述
我的控制器中有以下逻辑,但它在having
语句中失败。如果没有该$type
步骤,数据将按预期显示(因此addSelect
按预期工作)。如何having
使用计算列进行过滤meters_count
?
错误:
SQLSTATE[42703]: Undefined column: 7 ERROR: column "meters_count" does not exist
编码:
// Get all customers visible to this user
$query = Site::with('customer.logo', 'mainContact', 'address')
->addSelect(['meters_count' => Meter::selectRaw('COUNT(*)')->whereColumn('meters.site_id', 'sites.id')]);
// Filter for user type
switch ($type) {
case 'deleted':
$query->onlyTrashed();
break;
case 'no_meters':
$query->groupBy('sites.id')
->having('meters_count', '=', 0);
break;
default:
$query->groupBy('sites.id')
->having('meters_count', '>', 0);
}
// Run query here...
$sites = $query-get();
解决方案
我是这样做的:
// Get all customers visible to this user
$query = Site::with('customer.logo', 'mainContact', 'address')
->withCount('meters');
// Filter for user type
switch ($type) {
case 'deleted':
$query->onlyTrashed();
break;
case 'no_meters':
$query->groupBy('sites.id')
->havingRaw('(SELECT COUNT(*) FROM meters WHERE meters.site_id = sites.id) = ?', [0]);
break;
default:
$query->groupBy('sites.id')
->havingRaw('(SELECT COUNT(*) FROM meters WHERE meters.site_id = sites.id) > ?', [0]);
}
}
// Run query here...
$sites = $query->get();
推荐阅读
- nuxt.js - 使用 Nuxt.js 设置 bootstrap-vue
- javascript - 在 Adobe Illustrator 的 Extendscript 中添加文档时,是否可以设置其名称?
- java - android如何覆盖ACTION_PICK上的onActivityResult
- javascript - Mapbox NavigationViewOptions 和 NavigationLauncherOptions
- javascript - 如何正确更新反应钩子状态中的数组
- javascript - 在加载 AJAX 回复之前显示项目
- npm - 无法使用 npm 安装 firebase CLI
- python - Python:如何根据条件制作组合字段
- java - openVPN 在 androidstudio 中无法在 Android 10 上运行
- r - if (is.double(data$x) && !has_groups(data) && any(data$x != data$x[1L])) { 中的错误:需要 TRUE/FALSE 的缺失值