Шаблон отображения данных и автоматическое обновление других объектов - PullRequest
2 голосов
/ 31 января 2009

Я строю приложение PHP, используя шаблон отображения данных, чтобы отделить мою БД от объектов домена. У меня есть класс mapper, который возвращает объекты сайта на основе данных из БД и принимает существующие объекты сайта для сохранения обратно в БД.

Моя проблема в том, что в системе один (и только один) из всех сайтов должен быть помечен как "основной" сайт, что означает, что если я выберу один из них как основной, я бы хотел автоматически сбрасывает текущий первичный.

Итак, что-то вроде:

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

Вопрос в том, куда должна идти логика для автоматического обновления существующего первичного сайта? Это должно произойти после того, как объект был сохранен обратно в БД, а не раньше, если запрос БД не выполнен и у вас нет сайта в качестве основного.

Cheers, Jack

Ответы [ 2 ]

1 голос
/ 01 февраля 2009

Лично я бы подумал, что имеет смысл разместить дополнительную логику обновления с классом 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.

1 голос
/ 31 января 2009

Похоже на задание для триггера базы данных.

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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...