Как правильно составить этот mysql запрос с помощью конструктора Laravel?
Добрый день.
Есть три таблицы: одна с товарами, вторая с странами и третья с ценами на эти товары.
С товарами products
С странами countries
С ценами prices
В prices указана цена, а так-же есть два столбца product_id и country_id - т.к. под каждую страну, разная цена. По этому и сделана отдельная таблица.
Так-же есть входная переменная СТРОКА - {alias_product/country_id}. Пример: vk/2. Если их несколько, то - vk/2|tg/1 и т.д.
Эта переменная - это список исключений (дальше подробнее). Помимо этой строки у меня так-же есть переменная с числом ($amount), на которое нужно понизить/увеличить цену.
Мне нужно в таблице prices изменить цену ко всем товарам на $amount, но при этом нельзя менять товары исключения.
Я хочу сделать все одним запросом на конструкторе laravel. Разбирался долго в документации, не получается никак.
Единственное что у меня получается - это исключить с запроса цены на все продукты с N алиасом и N сраной.
Т.е. указали vk/2|tg/1, он уберет vk в 1 стране, vk в 2 стране, tg в 1 стране, tg в 2 стране.
А должен не трогать только vk в 2 стране и tg в 1 стране.
JhaoDa, Нет, за меня код не нужно писать. Мне нужно объяснить как его написать.
Код попыток не вставил, т.к. там вообще как мне кажется не то и могу только запутать.
# Это входная строка - исключения.
# Она в формате vk/1|tg/2. Я её делю по | на массив.
$exceptions = explode("|", $request->exceptions);
$ex_products = array();
$ex_country = array();
# Тут я уже буду название продукта (alias) отправлять в $ex_products
# А страну в $ex_country,
if(!empty($exceptions[0])) {
foreach ($exceptions as $ex) {
array_push($ex_products, explode("/", $ex)[0]);
array_push($ex_country, explode("/", $ex)[1]);
}
}
# На выходе получу массив с элементами vk, tg и еще один с элементами 1,2. Т.е. разделил алиасы и страны.
# Но как я думаю это возможно не стоило делать. Т.к. они должны быть связанны.
# Т.е. $ex_products[0] для этого продукта страна будет соответственно $ex_country[0].
# А как это сделать уже ниже, я не знаю.
$products_price = Price::whereIn('country_id', $ex_country)
->join('products', 'prices.product_id', '=', 'products.id')
->when($ex_products, function ($query) use($ex_products) {
return $query->whereIn('products.alias', $ex_products);
})->get();
# Там вместо whereIn должны стоять whereNotIn. Просто т.к. у меня много товаров сложно так отслеживать правильность кода.
# В общем, если мы оставляем whereIn то на выходе должны получить две записи. vk - с страной 1 и tg с страной 2.
# А по сути получаем 4 записи с vk в 1 и 2 стране и так-же ТГ.
Важная заметка:
Почему я обращаюсь к таблице products для сравнения алиаса, но не обращаюсь к countries для сравнение страны?
Потому-что в моей таблице prices, в которой мы все и делаем уже есть столбец country_id и я проверяю просто по нему. Но там нету столбцы product_alias, а есть только product_id. А как мы помним - входной параметр исключения у меня в формате {алиас продукта}/{id страны}. По этому мне нужно таблицу брать именно по нему.
tukbaevbr, А как правильно так очень много вариаций записать? У меня их там может образно быть 5-10, а может быть и одна. Я же не знаю кол-во. У меня просто массив.