padrão de mapeador de dados e atualizações automáticas de outros objetos

StackOverflow https://stackoverflow.com/questions/497320

  •  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

Foi útil?

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 ;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top