Я работаю с Shopware, и одна странность сводит меня с ума :( Так что сначала я объясню, в чем проблема.
Помимо обычных товаров, есть изделия с несколькими вариантами, например, рубашки разных размеров. Это тот же товар в XS, S, M, L и / или разных цветах ... но имеет разные номера заказов и, вероятно, разные цены.
Итак, в Shopware у вас есть таблица с основными данными о товарах, одна с подробными данными, а другая с возможными данными о ценах.
У статей с несколькими вариантами есть поля configurator_set_id и main_detail_id, установленные в таблице статей. Моя проблема в том, что у нас есть магазин, в котором много таких вариантов, и тот, кто строит логику магазина ... вероятно, был пьян. Если основной товар вариантного товара неактивен (отсутствует на складе, деактивирован и т. Д.), Весь вариантный товар больше не может быть куплен ... нет возврата к следующему варианту, он все еще находится в магазине, но вы не можете это сделать. что-нибудь вообще.
Так что я подумал, что все будет проще, просто обновите статью, если статус вариантов изменится ... но именно здесь мои проблемы начинаются. Итак, сначала структура таблицы:
s_articles:
+----+--------+----------------+---------------------+
| id | active | main_detail_id | configurator_set_id |
+----+--------+----------------+---------------------+
s_articles_details:
+------+---------+-----------+
| id | active | articleID |
+------+---------+-----------+
s_articles_prices
+----+-----------+-----------------+-------+
| id | articleID | articledetailID | price |
+----+-----------+-----------------+-------+
Для создания статьи Shopware в основном берет данные из s_articles, объединяет их с данными из s_articles_details, где id = s_articles.main_details_id.
Я пытался добиться следующего:
- Если s_articles_details обновлен, получите идентификатор строки, которая была обновлена.
- Проверьте, соответствует ли идентификатор main_detail_id в таблице s_articles
- Если он обновляет строку, установите main_detail_id = (s_articles_prices.articledetailID ГДЕ s_articles_prices.articleID = id AND min (s_articles_prices.price))
* Я знаю, что это не сработает, но, надеюсь, это описывает то, что я думаю
Причуды:
- может быть более одного совпадения из s_articles_prices db
- это должен быть активный вариант / цена, которая определяется через таблицу s_articles_details
Мы будем благодарны за любую помощь или толчок в правильном направлении (пока я стараюсь не биться головой о стену ...)
РЕДАКТИРОВАТЬ: окончательное решение
jean-françois-savard указал мне правильное направление, поэтому я придумал следующее решение:
DELIMITER $$
CREATE TRIGGER update_maindetailid_after_update AFTER UPDATE ON s_articles_details
FOR EACH ROW
BEGIN
DECLARE ArticleDetailID INT(11);
SELECT p.articledetailsID
INTO ArticleDetailID
FROM s_articles_prices p, s_articles_details d
WHERE p.articleID = NEW.articleID
AND d.id = p.articledetailsID
AND d.active
ORDER BY p.price, d.ordernumber ASC
LIMIT 1;
IF ArticleDetailID <> "" THEN
UPDATE s_articles SET s_articles.main_detail_id = ArticleDetailID
WHERE s_articles.id = NEW.articleID
AND s_articles.main_detail_id <> ArticleDetailID;
END IF;
END$$;
DELIMITER ;