Lançado Adianti Framework 7.6!
Clique aqui para saber mais
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 completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto 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.         
  6.         if ($objects)
  7.         {
  8.             foreach ($objects as $object)
  9.             {
  10.                 $object-> $foreign_key  $id;
  11.                 $object->store();
  12.             }
  13.         }
  14.     }
  15. ?>


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.         
  10.         // critério para apagar os agregados
  11.         $criteria = new TCriteria;
  12.         $criteria->add(new TFilter('book_id''='$this->id));
  13.         
  14.         // descobre os ids dos items que devem ser mantidos
  15.         if ($this->items)
  16.         {
  17.             foreach ($this->items as $item)
  18.             {
  19.                 if ($item->id)
  20.                 {
  21.                     $item_ids[] = $item->id;
  22.                 }
  23.             }
  24.         }
  25.         
  26.         
  27.         // apaga todos os itens, menos os que persistem
  28.         $criteria->add(new TFilter('id''NOT IN'$item_ids));
  29.         $repository = new TRepository('Item');
  30.         $repository->delete($criteria);
  31.         
  32.         // store the items
  33.         if ($this->items)
  34.         {
  35.             foreach ($this->items as $item)
  36.             {
  37.                 $item-> book_id $this-> id;
  38.                 $item->store();
  39.             }
  40.         }
  41.     }
  42. }
  43. ?>


Abs,
Pablo