Laravel子查询加入到哪里

时间:2018-03-21 17:29:26

标签: php laravel laravel-5 eloquent laravel-eloquent

所以我正在创建这种查询

$data = App\SalesReport::with('company')->join(DB::RAW('(SELECT company_id, MAX(periods) AS max_periods FROM laporancu GROUP BY company_id) latest_report'),function($join){
    $join->on('salesreport.company_id','=','latest_report.company_id');
    $join->on('salesreport.periods','=','latest_report.max_periods');
})->FilterPaginateOrder();

我想放where('periods','<=','2016-01-01'),但我不知道我应该把它放在哪里......

我试图把它放在with('company')之后,它不会在2015年返回salesreport,即使我认为我在数据库中有一些。所以经过实验,我想我知道它为什么会发生。

因为我有$join->on('salesreport.periods','=','latest_report.max_periods');,甚至认为salesreport.periods的周期小于2016-01-01,但由于该加入,它将始终与latest_report的最大句点匹配

所以我认为我应该在查询执行时添加那些where子句

DB::RAW('(SELECT company_id, MAX(periods) AS max_periods FROM laporancu GROUP BY company_id) latest_report')
但是怎么样?我应该把它放在哪里?

更新:确切的sql语句(没有公司关系)

SELECT salesreport.* FROM salesreport
 INNER JOIN (SELECT company_id, MAX(periods) AS max_periods FROM salesreport GROUP BY company_id) AS latest_report
       ON salesreport.company_id = latest_report.company_id AND salesreport.periods = latest_report.max_periods
WHERE salesreport.periods <= 2016-01-01;

更新2

所以我认为在检查了我的查询之后我发现我的查询有问题,所以在我的联接中我做MAX(periods)因为它会一直返回这些字段的最高值,问题是我想限制我想要返回的价值有多高。

所以也许有人可以想到其他事情来帮助我实现这个目标吗?

2 个答案:

答案 0 :(得分:0)

我已经在我自己的代码中做了一些研究,因为我经常需要这个,提出了这个解决方案:

$data = App\SalesReport::with('company')->join(DB::RAW('(SELECT company_id, MAX(periods) AS max_periods FROM laporancu GROUP BY company_id) latest_report'),function($join){
    $join->on('salesreport.company_id','=','latest_report.company_id');
    $join->on('salesreport.periods','=','latest_report.max_periods');
})->where('periods','<=','2016-01-01')->FilterPaginateOrder();

如果有效,请告诉我。如果没有,你会得到什么错误:)

答案 1 :(得分:0)

在搜索并寻求帮助之后,我终于得到了一个解决方案,就像我需要的那样,所以这就是它:

$periods = '2016-01-01';
$data = App\SalesReport::with('company')->join(DB::RAW('(SELECT company_id, MAX(periods) AS max_periods FROM salesreport WHERE periods <= '$periods' GROUP BY company_id) latest_report'),function($join){
    $join->on('salesreport.company_id','=','latest_report.company_id');
    $join->on('salesreport.periods','=','latest_report.max_periods');
})->where('periods','<=','2016-01-01')->FilterPaginateOrder();

希望它能帮助将来想要像我一样做类似查询的人