Как связать подзапрос в Laravel QueryBuilder с внешней таблицей - PullRequest
0 голосов
/ 07 февраля 2019

Я смотрю, как можно создать подзапрос в 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 является воскресеньем ...)

Iоднако я понятия не имею, как я могу сделать это с Eloquent QueryBuilder, не возвращаясь к необработанным запросам sql ...

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

1 Ответ

0 голосов
/ 07 февраля 2019

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(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...