【问题标题】:Change raw query join into laravel Eloquent将原始查询连接更改为 laravel Eloquent
【发布时间】:2026-01-19 11:20:05
【问题描述】:

我有两个模型:

$modelMain = "SearchPages"; //table_name : search_pages
$modelSites = "Site"; // table_name : sites

我最初有一个以下查询,用于仅从一个模型 $modelMain 获取计数:

$records = $modelMain::
        select(DB::raw("COUNT(DISTINCT {$columnRecordedOn}) as records_count"))
        ->groupBy($columnRecordedOn, $columnSiteId)
        ->get();

现在,我需要将它与第二个模型 $modelSites 加入它,其表名为 sites,以便检查 sites 中的状态列是否为 1。

我将查询修改为:

$records = $modelMain::
    select(DB::raw("COUNT(DISTINCT {$columnRecordedOn}) as records_count"))
    ->join('sites','search_pages.site_id','=','sites.site_id') //added this
    ->where('sites.status','=','1') // and this
    ->groupBy($columnRecordedOn, $columnSiteId)
    ->get();

一切正常,但如您所见,我在join()where() 中直接使用表名sites,而我认为我必须使用模型名称。

如何将此查询转换为正确的 Laravel Eloquent?

感谢您的帮助。

【问题讨论】:

    标签: php mysql laravel eloquent


    【解决方案1】:

    您是否考虑过在 Eloquent 中使用关系,您应该在两个模型中声明关系,例如:

    class SearchPages extends Eloquent {
    
        public function sites()
        {
        return $this->hasMany('sites');
        }
    
    }
    

    有关 Eloquent 和关系的更多信息,请参阅此参考: http://laravel.com/docs/4.2/eloquent#relationships

    【讨论】:

      【解决方案2】:

      基本上可以使用“with”方法获取相关模型

      网站模型

      class Site extends Eloquent {
      
          public function searchpages()
          {
          return $this->hasMany('SearchPage','site_id','site_id');
          }
      
      }
      

      搜索页面模型

      class SearchPage extends Eloquent {
      
          public function site()
          {
          return $this->belongTo('Site','site_id','site_id');
          }
      
      }
      

      $records = SearchPage::with('site')->get();

      根据您的需要

      $records = SearchPage::
             select(DB::raw("COUNT(DISTINCT {$columnRecordedOn}) as records_count"))
          ->whereHas('site' => function($q){
                                              $q->where('status','1');
                                          })
          ->groupBy($columnRecordedOn, $columnSiteId)
          ->get();
      

      【讨论】:

      • 感谢@Kamlesh.bar ,但它不会根据状态进行过滤,但是会给出任何错误。
      • @Fahad 我输入了错误的名称“站点”,而不是根据 SearchPage 模型中的函数名称应该是“站点”。现在编辑答案
      • 我已经更正了……它仍然返回所有记录。
      • 它应该可以工作。你能把它贴在下面 $queries = DB::getQueryLog(); $last_query = end($queries); print_r($last_query);退出;
      • 我有Common::showQuery(1); 用于显示查询。它返回select * from sites` 其中sites.site_id 在(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)和状态=1`