padrão de mapeador de dados e atualizações automáticas de outros objetos
-
20-08-2019 - |
Pergunta
Estou construindo uma aplicação PHP utilizando o padrão de mapeador de dados para separar minha DB a partir dos objetos de domínio. Eu tenho uma classe mapeador de que os retornos do Site objetos com base em dados do DB e aceita existente site objetos para ser salvo de volta para o DB.
O meu problema é que, em um sistema (e apenas um) de todos os sites tem que ser marcado como o site "primário", o que significa que se eu definir uma como a principal, eu gostaria de ser capaz de resetar automaticamente a corrente primária.
Assim, algo como:
$mapper = new Site_Mapper();
$site = $mapper->fetch(2);
$site->isPrimary = true;
$mapper->save($site);
de alguma forma no fundo automaticamente fazer isso:
$mapper = new Site_Mapper();
$site = $mapper->fetch(1);
$site->isPrimary = false;
$mapper->save($site);
A pergunta é, onde deve a lógica para atualizar automaticamente o movimento local primário existente? Tem que acontecer depois que o objeto é salvo de volta para o DB, e não antes, no caso a consulta DB falhar e você é deixado com nenhum site como o principal.
Cheers, Jack
Solução
Pessoalmente eu acho que faz mais sentido colocar a lógica atualização adicional com a classe Site_Mapper, especialmente considerando que você está lidando com a mesma tabela / mapper em ambos os casos. Você poderia simplesmente substituir o método save ($ siteObj) para que ele funciona assim:
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);
}
Obviamente você poderia criar qualquer função de economia () um costume de fazer isso talvez um pouco mais suave ou você poderia usar um if comparação para garantir que você realmente precisa para executar a instrução de atualização.
Outras dicas
soa como um trabalho para um gatilho de banco de dados.
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 ;