私は Shopware で作業していますが、1 つの奇妙なことに頭がおかしくなりそうです :( まず、問題が何であるかを説明します。
通常品以外にも、シャツのサイズ違いなど、複数のバリエーションがあるものもあります。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 からデータを取得し、id = s_articles.main_details_id である s_articles_details のデータと結合します。
私が達成しようとしていたのは次のとおりです。
- s_articles_details が更新された場合、更新された行の ID を取得します。
- ID が s_articles テーブルの main_detail_id に対応しているかどうかを確認します
- 行を更新する場合は、main_detail_id = (s_articles_prices.articledetailID WHERE s_articles_prices.articleID = id AND min(s_articles_prices.price)) を設定します。
*これが機能しないことはわかっていますが、うまくいけば、私が何を言おうとしているのかを説明できます
癖:
- s_articles_prices データベースから複数の一致がある可能性があります
- 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 ;