Laravel 根据 2 个相关列查询获取行

Laravel Query get row based on 2 dependent column

帮我查询一下。 我有一个 Laravel 应用程序,其中有一个 table 有 3 列(季度、年份、值)。

quartal year value
1 2019 3
2 2019 5
3 2019 5
4 2019 10
1 2020 7
2 2020 5

例如,我想获取从 quartal 3 years 2019 到 quartal 2 years 2020 的值 如何查询这个案例? 对于我可以使用的年份,但对于四分之一,这取决于年份。

这是我当前的查询。但效果不是很好

DB::table($table)
->whereBetween('year',[$startYear, $endYear])
->whereBetween('quartal',[$startQuartal, $endQuartal])
->get();

如何将四分之一添加到年份?

DB::table($table)
    ->whereBetween(
        DB::raw('year + (quartal - 1) / 4'),
        [
            $startYear + ($startQuartal - 1) / 4,
            $endYear + ($endQuartal - 1) / 4
        ]
    )
    ->get();

您需要做的是从 quartalyear 创建一个复合列,然后查询它。

DB::table($table)
->whereRaw("concat(year,quartal) >= ?", "$startYear$startQuartal")
->whereRaw("concat(year,quartal) <= ?", "$endYear$endQuartal")
->get();

您可以参考此 SQL 查询 https://www.db-fiddle.com/f/4GRH5RKqQi2Fc6wVvxK8C2/0

你也可以用过滤功能来做,而且很简单,就像

$startYear = 2019
$endyear = 2020
$startQuartar = 3
$endQuartar = 2
DB::table($table)
->whereBetween('year',[$startYear, $endYear])
->get()->filter(function($query) use 
($startYear,$endYear,$startQuartar,$endQuartar){
    if($query->year == $startYear and $query->quartar < $startQuartar){
       return false;
    }
    if($query->year == $endYear and $query->quartar > $endQuartar){
      return false;
    }
      return true;
});