【问题标题】:Laravel Query get row based on 2 dependent columnLaravel Query 基于 2 个依赖列获取行
【发布时间】:2021-12-05 15:13:12
【问题描述】:

帮我查询一下。 我有一个 Laravel 应用程序,其中有一个包含 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();

【问题讨论】:

    标签: mysql laravel eloquent laravel-query-builder


    【解决方案1】:

    您需要做的是从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

    【讨论】:

    • 这对我很有用。但是,仍然编辑它'"concat(year,quartal)>=$startYear$startQuartal"',不知道为什么有时它给出的数据少于它应该有一个“?”。谢谢你的解决方案
    • 这不是一个好主意,您将容易受到 SQL 注入附加的攻击。我建议使用toSsql()getBindings() 进行调试,以查看查询的实际情况。
    【解决方案2】:

    您也可以使用过滤功能来做到这一点,就像一个简单的方法

    $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;
    });
    

    【讨论】:

      【解决方案3】:

      把夸脱加到年份怎么样?

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

      【讨论】:

        猜你喜欢
        • 2020-06-01
        • 2016-04-08
        • 1970-01-01
        • 2023-03-25
        • 2016-11-29
        • 2017-05-12
        • 2016-10-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多