【问题标题】:get contracts entries based on documents expiration_date根据文档 expire_date 获取合同条目
【发布时间】:2022-01-28 12:06:29
【问题描述】:

我在 laravel 8 中有这个查询:

DB::table('contracts')
  ->leftJoin('documents', 'contracts.id', '=', 'documents.contract_id')
  ->whereNotNull('expiration_date')
  ->whereMonth('expiration_date', '01')
  ->whereYear('expiration_date', '2022')
  ->select('documents.contract_id', 'documents.is_contract', 'documents.expiration_date')
  ->get();

合同 - 文档(一对多)

expiration_date 在 Documents 表中并且可以为空。

如果合同有 2 个填写了 expire_date 的文档,那么它将返回两个条目(对于同一个合同)。

我想从文档中获取过期日期的最后一个条目(合同只有一个条目)

例如:如果合同有 2 个设置了 expire_date 的文档...我只想获取该合同的最后一个 expiration_date 值。

我该怎么做?

【问题讨论】:

  • 我不是专家,但SELECT MAX(expiration_date) GROUP BY contract 似乎是一个好的开始。

标签: php mysql laravel


【解决方案1】:

使用 any_values 似乎可以工作

DB::table('contracts')
  ->leftJoin('documents', 'contracts.id', '=', 'documents.contract_id')
  ->whereNotNull('expiration_date')
  ->whereMonth('expiration_date', '04')
  ->whereYear('expiration_date', '2022')
  ->select('documents.contract_id')
  ->selectRaw('max(documents.expiration_date) as expiration_date, any_value(documents.is_contract) as is_contract, any_value(documents.description) as description')
  ->groupBy('documents.contract_id')
  ->get();

【讨论】:

    【解决方案2】:

    请试试这个:latest 会得到最新的 expire_date。

    DB::table('contracts')
          ->leftJoin('documents', 'contracts.id', '=', 'documents.contract_id')
          ->latest('expiration_date')
          ->whereNotNull('expiration_date')
          ->whereMonth('expiration_date', '01')
          ->whereYear('expiration_date', '2022')
          ->select('documents.contract_id', 'documents.is_contract', 'documents.expiration_date')        
          ->get();
    

    【讨论】:

    • 得到相同的结果 .... 在这种情况下,最后 2 个条目指向相同的合同 ID(最后 2 个条目来自同一个合同)
    • 没有意义。我需要所有的合同不是 first() :-)
    【解决方案3】:

    假设您在ContractsDocuments 之间有正确的模型和关系,并且documents.expired_at 是正确的MySQL 日期格式,您可以尝试latest() 方法:

    Contracts::with('documents', function($query) {
        $query->latest('expired_at')->first();
    })->get();
    

    此代码适用于“Eloquent”方式,而不适用于您使用的“Builder”方式。并且仅包括您问题的“仅采用该合同的最后一个到期日期值”部分的示例。

    【讨论】:

    • 那么 whereMonth, whereYear 呢?我只需要查看 2022 年 1 月到期的合同
    猜你喜欢
    • 2022-11-24
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2019-01-26
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多