1

私は 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 のデータと結合します。

私が達成しようとしていたのは次のとおりです。

  1. s_articles_details が更新された場合、更新された行の ID を取得します。
  2. ID が s_articles テーブルの main_detail_id に対応しているかどうかを確認します
  3. 行を更新する場合は、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 ;
4

1 に答える 1

0
  • Triggerここで必要なものです。
  • 更新が行われるたびに起動されるトリガーを作成しますs_articles_details
  • NEWトリガーの本体でキーワードを使用して、新しい値を参照します。
  • 新しい値に従って、条件を実行しupdate/insert、他のテーブルの正しい値を実行します。

開始に役立つスニペット

DELIMITER $$
CREATE TRIGGER tr_au_s_articles_details AFTER UPDATE ON s_articles_details
FOR EACH ROW
BEGIN
   -- Here you can access the id of the updated article New.id
   -- update/insert depending on the condition of the newvalue.
   -- Check if id corresponds to a main_detail_id in the s_articles table
   -- Here an int : select count(id) from s_articles where main_detail_id = new.id
END;
DELIMITER ;

構文の詳細については、ドキュメントを参照してください。Trigger

コードをスプーン/フィードしませんが、これで簡単に解決できるはずです:)。

于 2015-02-09T21:06:59.673 に答える