2

DB をドメイン オブジェクトから分離するために、データ マッパー パターンを使用して PHP アプリケーションを構築しています。DB からのデータに基づいて Site オブジェクトを返し、既存の Site オブジェクトを受け入れて DB に保存するマッパー クラスがあります。

私の問題は、システムでは、すべてのサイトのうち 1 つ (そして 1 つだけ) を「プライマリ」サイトとしてマークする必要があることです。つまり、1 つをプライマリとして設定した場合、現在のプライマリ。

したがって、次のようなものです:

$mapper = new Site_Mapper();
$site = $mapper->fetch(2);
$site->isPrimary = true;
$mapper->save($site);

バックグラウンドでどういうわけか自動的にこれを行います:

$mapper = new Site_Mapper();
$site = $mapper->fetch(1);
$site->isPrimary = false;
$mapper->save($site);

問題は、既存のプライマリ サイトを自動的に更新するためのロジックをどこに置くべきかということです。DBクエリが失敗し、プライマリとしてのサイトが残っていない場合に備えて、オブジェクトがDBに保存される前ではなく、後で発生する必要があります。

乾杯、ジャック

4

2 に答える 2

1

データベーストリガーの仕事のように聞こえます。

DELIMITER $$

CREATE TRIGGER test_trigger AFTER INSERT ON table
  FOR EACH ROW BEGIN
    IF NEW.isPrimary = 1 THEN 
       UPDATE table 
       SET isPrimary = 0
       WHERE id <> NEW.id;
    END IF;
  END$$

DELIMITER ;
于 2009-01-30T21:47:43.860 に答える
1

個人的には、特に両方のインスタンスで同じテーブル/マッパーを扱っていることを考えると、追加の更新ロジックを Site_Mapper クラスに配置することが最も理にかなっていると思います。次のように動作するように、単に save($siteObj) メソッドをオーバーライドできます。

 public function save($siteObj) 
 {
     // Save the passed object.

     $sql = "UPDATE site SET isPrimary = 1 WHERE id != ?";

     $stmt = new PDO_Statement($sql);

     $stmt->execute($siteObj->id);

 }

明らかに、カスタム save() 関数を作成してこれをよりスムーズに行うか、if 比較を使用して update ステートメントを実際に実行する必要があることを確認することができます。

于 2009-02-01T15:44:51.703 に答える