Laravel查询构建器:创建子查询,子查询的列过多

时间:2020-11-08 22:01:44

标签: laravel postgresql subquery

我正在尝试连接两个表(访问和观察)并提取两个列(年+月组合和总数)。我正在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,但是我想尽可能地坚持使用查询生成器。 任何帮助将不胜感激。

2 个答案:

答案 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();
相关问题