【问题标题】:Laravel query builder: create subquery, subquery has too many columnsLaravel 查询生成器:创建子查询,子查询列太多
【发布时间】:2021-02-20 21:22:31
【问题描述】:

我正在尝试加入两个表(访问和观察)并提取两列(年+月组合和总数)。我正在使用 php+Laravel 7.3,我正在尝试使用他们的查询生成器。不知何故,我不断收到错误消息:“子查询列太多”。

在 postgres 中,查询如下: select to_char(visits.startdate, 'YYYY-MM') as yearmonth, SUM(observations.number) as total from opinion join visits.id=observations.id where visit_id in (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 以某种方式从其中创建了一个子查询,并尝试在其中添加另一个并失败。 (我尝试切换 wheres,但没有奏效)。我当然可以对整个查询使用 BD::raw,但我想尽可能地坚持使用查询生成器。 任何帮助将不胜感激。

【问题讨论】:

    标签: laravel postgresql subquery


    【解决方案1】:

    您可以尝试只使用一个DB::raw 吗?

    ->select(DB::raw("to_char(visits.startdate, 'YYYY-MM') as yearmonth, SUM(observations.number)"))
    

    【讨论】:

      【解决方案2】:

      感谢您的回复,我尝试了,但将所有内容合并到一个 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();
      

      【讨论】:

        猜你喜欢
        • 2017-01-17
        • 2013-08-07
        • 2021-12-03
        • 2020-11-24
        • 1970-01-01
        • 2020-03-12
        • 2021-04-27
        • 2017-06-04
        • 2015-07-10
        相关资源
        最近更新 更多