我正在研究如何在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-02-03时有效,并且关联起息日(可能为2019-02-01,因为2019-02-03是个星期天...)
但是我不知道如何使用Eloquent QueryBuilder做到这一点,而又不退回到原始的SQL查询...
$value_date = '2019-02-03';
App\ExchangeRate::where('value_date', function($query) use ($value_date) {
... ??? ...
});
答案 0 :(得分:1)
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();
这是查询的output。
编辑:要为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();