Tabelas com varias relações O Framework disponibiliza um método para salvar composições, porem o mesmo limpa a tabela e a reescreve novamente, mas se eu tiver mais relações com uma tabela especifica, como seria a sobrecarga do método store() para manter minha integridade referencial?...
AM
Tabelas com varias relações  
Fechado
O Framework disponibiliza um método para salvar composições, porem o mesmo limpa a tabela e a reescreve novamente, mas se eu tiver mais relações com uma tabela especifica, como seria a sobrecarga do método store() para manter minha integridade referencial?

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (7)


AS

tenh um relacionamento com 5 tabelas e o metdo save::composition funciona lindamente
AM

Ola Alexandre, bom o metodo save::composition funciona muito bem! porem o mesmo apaga os registros e reescreve eles novamente! no mysql os registros ganham novos IDs então se essa tabela em questão tiver relacionamentos com outras tabelas iremos perder a integridade referencial da mesma.
AS

fui ver e é mesmo porem meus templtes estão editados, rere fiz assim para resolver o problema

 
  1. <?php
  2. public function saveComposite($composite_class, $foreign_key, $id, $objects)
  3. {
  4. // $this->deleteComposite($composite_class, $foreign_key, $id);
  5. if ($objects)
  6. {
  7. foreach ($objects as $object)
  8. {
  9. $object-> $foreign_key = $id;
  10. $object->store();
  11. }
  12. }
  13. }
  14. ?>


Vuala, não entendi o porque tem isso de apagar
AM

Se ele não apagar ele duplicara o registro! acho que esse metodo precisa ser melhorado!
AS

realmente , estranho é que tenho o senario onde tenho 5 tabelas ligas e não deu problema em relção a isso
um sistema de clinica, você fez o teste para ve se da algum erro?
AM

No SQLITE o sistema reescreve os dados mas como o ID [e gerado pelo sistema acaba que eles ficam com o mesmo ID, mas no mysql se vc apagar o registro 5 o próximo registro sera o 6, ele nunca ira aproveitar o registro 5 se o ID estiver com opção de autoincremento
PD

Olá,

Não recomendo alterar o método padrão do framework, que já foi testado em vários cenários. O comportamento esperado da implementação de composição no framework é apagar e reinserir. Caso seja necessário preservar os ID's, recomendo dar uma olhada na aplicação Library:
www.adianti.com.br/framework-library

Mais precisamente no método Book::store(), pois ele preserva os ID's da relação de composição, sem ser necessário alterar o código do framework ;-)

 
  1. <?php
  2. class Book extends TRecord
  3. {
  4. // ...
  5. public function store()
  6. {
  7. // grava o livro
  8. parent::store();
  9. // critério para apagar os agregados
  10. $criteria = new TCriteria;
  11. $criteria->add(new TFilter('book_id', '=', $this->id));
  12. // descobre os ids dos items que devem ser mantidos
  13. if ($this->items)
  14. {
  15. foreach ($this->items as $item)
  16. {
  17. if ($item->id)
  18. {
  19. $item_ids[] = $item->id;
  20. }
  21. }
  22. }
  23. // apaga todos os itens, menos os que persistem
  24. $criteria->add(new TFilter('id', 'NOT IN', $item_ids));
  25. $repository = new TRepository('Item');
  26. $repository->delete($criteria);
  27. // store the items
  28. if ($this->items)
  29. {
  30. foreach ($this->items as $item)
  31. {
  32. $item-> book_id = $this-> id;
  33. $item->store();
  34. }
  35. }
  36. }
  37. }
  38. ?>


Abs,
Pablo