1

我正在研究如何让 Laravel QueryBuilder 中的子查询与外部表连接。例如,我们有一个包含汇率的表,其中包含货币和 value_date。

对于每种货币,我们都希望能够获取某个生效日期的有效汇率。由于汇率在非工作日不会发生变化,这意味着对于周六和周日,周五的值仍然有效。有点明显和标准的情况。

在 SQL 中,我会这样查询:

SELECT currency, value_date, rate
FROM exchange_rates er
WHERE value_date = (
    SELECT max(value_date)
    FROM exchange_rates
    WHERE currency = er.currency
    AND value_date <= '2019-02-03'
)

这将返回所有汇率的列表(每种货币的一条记录),汇率在 2019 年 2 月 3 日有效,关联起息日(可能是 2019 年 2 月 1 日,自 2019 年 2 月起) -03 是星期天...)

但是我不知道如何使用 Eloquent QueryBuilder 做到这一点,而不会退回到执行原始 sql 查询......

$value_date = '2019-02-03';
App\ExchangeRate::where('value_date', function($query) use ($value_date) {
    ... ??? ...
});
4

1 回答 1

2

where()也可以接受一个允许你这样做的闭包:

return ExchangeRate::select('currency', 'value_date', 'rate')
    ->where('value_date', function($query) {
        $query->from('exchange_rates AS er')
            ->selectRaw('max(value_date)')
            ->whereColumn('exchange_rates.currency', 'er.currency')
            ->where('value_date', '<=', '2019-02-03');
    })->get(); 

这是查询的输出

编辑:要为outer表分配别名,您可以使用 DB Query Builder 执行此操作。

return DB::table('exchange_rates AS alias')
    ->select('currency', 'value_date', 'rate')
    ->where('value_date', function($query) {
        $query->from('exchange_rates AS er')
            ->selectRaw('max(value_date)')
            ->whereColumn('alias.currency', 'er.currency')
            ->where('value_date', '<=', '2019-02-03');
    })->get(); 
于 2019-02-07T15:43:16.837 回答