如何将Laravel QueryBuilder中的子查询链接到外部表

如何将Laravel QueryBuilder中的子查询链接到外部表,laravel,eloquent,Laravel,Eloquent,我正在研究如何使Laravel QueryBuilder中的子查询与外部表联接。例如,我们有一个包含汇率、货币和日期的表 对于每种货币,我们希望能够获取特定valuedate的有效汇率。由于汇率在非工作日不变,这意味着周六和周日,周五的价值仍然有效。有点明显和标准的情况 在SQL中,我将如下查询: SELECT currency, value_date, rate FROM exchange_rates er WHERE value_date = ( SELECT max(value_d

我正在研究如何使Laravel QueryBuilder中的子查询与外部表联接。例如,我们有一个包含汇率、货币和日期的表

对于每种货币,我们希望能够获取特定valuedate的有效汇率。由于汇率在非工作日不变,这意味着周六和周日,周五的价值仍然有效。有点明显和标准的情况

在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'
)
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(); 

所以“汇率.货币”与外表有关。当使用模型作为起点时,我可以从外部查询中明确地为汇率分配别名吗?明白了,但这意味着我需要“知道”表名。。。我更喜欢从模型开始我的查询。。。谢谢你!还有-我想从我的模型开始的另一个原因是我们非常依赖全局范围;它们不能丢失;-)使用DB::table()时,作用域将丢失…
(new ExchangeRate)->getTable()
将输出与您的
ExchangeRate
模型关联的表名:)是的,它可以工作-只是可读性。在内部选择上,我更喜欢总是明确地能够引用外部选择的表;不给它别名会让我“认为”它将使用内部表。它工作得很好,所以感谢您的反馈——有时我们只是有疯狂的“相信”,我们不想放弃;-)
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(); 
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();