我正在尝试连接两个表(访问和观察)并提取两个列(年+月组合和总数)。我正在php + Laravel 7.3中工作,我正在尝试使用其查询生成器。我不知何故一直收到错误消息:“子查询的列太多”。
在postgres中,查询将如下所示:选择to_char(visits.startdate,'YYYY-MM')作为年月,选择SUM(observations.number)作为观察值的总和,加入对visits.id = observations.id的访问。 (1,2,3,4,5)和species_id = 13组(按年份)
我已经尝试过了:
$allVisObs = DB::table('visits')
->join('observations', 'visits.id', '=', 'observations.visit_id')
->select(DB::raw("to_char(visits.startdate, 'YYYY-MM') as yearmonth") , DB::raw("SUM(observations.number)"))
->whereIn('visits.id', $allVisits)
->where('observations.species_id', $spid)
->groupBy('yearmonth')->get();
还有这个:
$visObs = DB::table('visits')
->join('observations', 'visits.id', '=', 'observations.visit_id')
->select(DB::raw("to_char(visits.startdate, 'YYYY-MM') as yearmonth") , DB::raw("SUM(observations.number)"))
->whereIn('visits.id', $allVisits)
->where(function ($query) use ($spid) {
$query->where('observations.species_id', '=', $spid);
})
->groupBy('yearmonth')->get();
但是两者都给我一个错误:“子查询有太多列”。我检查了$ allVisits是一个有效的ID列表,而$ spid也是一个正确的ID。查询运行良好,但没有以下行:“-> where('observations.species_id,$ spid)”。因此,我怀疑Laravel从其中以某种方式进行子查询,并尝试在失败的地方添加其他子查询。 (我尝试切换位置,但这没有用)。我当然可以对整个查询使用BD :: raw,但是我想尽可能地坚持使用查询生成器。 任何帮助将不胜感激。
答案 0 :(得分:0)
您可以只使用一个DB::raw
吗?
->select(DB::raw("to_char(visits.startdate, 'YYYY-MM') as yearmonth, SUM(observations.number)"))
答案 1 :(得分:0)
感谢您的答复,我尝试过,但是将所有内容组合到一个DB:raw中并不能解决问题。但是,将where子查询放在自定义函数中似乎确实可行:
$visObs = DB::table('visits')
->join('observations', 'visits.id', '=', 'observations.visit_id')
->select(DB::raw("to_char(visits.startdate, 'YYYY-MM') as yearmonth, SUM(observations.number)"))
->where('observations.species_id', '=', $spid) //I moved this out of the function
->where(function ($query) use ($visitIds) {
$query->whereIn('visits.id', $visitIds); //and I put this in this function
})
->groupBy('yearmonth')->get();