Благодарю Всех за помощь и информацию в решении задачи.
Учитывая, что данная информация возможно будет полезна для других, опишу выбранный мною способ решения.
Действительно, задачу регулярного обновления цен в зависимости от курса валют, можно решить разными способами. Для себя я выбрал способ обновления данных с использованием сырых raw запросов к базе данных. Учитывая, что данные курса валют обновляются не часто, только раз в сутки – считаю это будет оптимальным, не ресурсозатратным способом.
Данные товаров, в том числе их стоимости, хранятся в таблице ‘ product’, в которой так же содержаться поля для определения цены товара:
- ‘base_price’ – Базовая цена товара, стоимость в рублях, долларах, евро
- ‘currency’ – Тип, в какой валюте задана базовая цена: в рублях RUB, в евро EUR или долларах USD
- ‘price’ – конвертированная цена, с учетом текущего курса валюты.
Свежие данные о курсе валют получаются по API Центрбанка РФ и сохраняются в таблице ‘currency’.
В контроллере получаю коллекцию и преобразую в массив с необходимыми данными о типе валюты, номинале и значении действующего курса.
$currency = Currency::select('currency', 'Nominal', 'value')->get()->keyBy('currency')->toArray();
Затем с помощью RAW запросов обращаюсь к базе для обновления каждого типа валюты. На пример, для товаров, базовая цена которых задана в ЕВРО (‘currency’ = 'EUR'), обновление данных будет происходить следующим запросом:
$countUpdate = DB::update("UPDATE `product` SET `price` = (`base_price` * ?) WHERE `currency`='EUR'", [ $currency['EUR']['value'] ]);
То есть из таблицы товаров (
"UPDATE `product`) выбираются данные товаров где поле
‘currency’ – тип валюты, задано как (
WHERE `currency`='EUR'), и для поля
`price` устанавливаются значения, где данные базовой цены умножаются на сумму действующего курса валюты (
`price` = (`base_price` * $currency['EUR']['value']).
Таким образом, четырьмя аналогичными запросами происходит конвертация в рубли и обновление цен товаров, цена которых задана в валюте. Используя функции MySQL ELT() и FIELD() данные запросы можно объединить в один.