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

<?php   public function saveComposite($composite_class, $foreign_key, $id, $objects)    {     //   $this->deleteComposite($composite_class, $foreign_key, $id);                if ($objects)        {            foreach ($objects as $object)            {                $object-> $foreign_key  = $id;                $object->store();            }        }    }?>


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

<?phpclass Book extends TRecord{    // ...    public function store()    {        // grava o livro        parent::store();                // critério para apagar os agregados        $criteria = new TCriteria;        $criteria->add(new TFilter('book_id', '=', $this->id));                // descobre os ids dos items que devem ser mantidos        if ($this->items)        {            foreach ($this->items as $item)            {                if ($item->id)                {                    $item_ids[] = $item->id;                }            }        }                        // apaga todos os itens, menos os que persistem        $criteria->add(new TFilter('id', 'NOT IN', $item_ids));        $repository = new TRepository('Item');        $repository->delete($criteria);                // store the items        if ($this->items)        {            foreach ($this->items as $item)            {                $item-> book_id = $this-> id;                $item->store();            }        }    }}?>


Abs,
Pablo