2

我正在使用数据映射器模式构建一个 PHP 应用程序,以将我的数据库与域对象分开。我有一个映射器类,它根据数据库中的数据返回站点对象,并接受现有的站点对象以保存回数据库。

我的问题是,在系统中,所有站点中的一个(也是唯一一个)必须标记为“主要”站点,这意味着如果我将一个设置为主要站点,我希望能够自动取消设置当前的初级。

所以,像:

$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);

问题是,自动更新现有主站点的逻辑应该去哪里?它必须在对象保存回数据库之后发生,而不是之前,以防数据库查询失败并且您没有站点作为主要站点。

干杯,杰克

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 比较来确保您确实需要运行更新语句。

于 2009-02-01T15:44:51.703 回答