Cakephp – Inserindo mais de um registro no banco de dados

Posted on the setembro 28th, 2009 under CakePHP by Renan Lima

Hoje me deparei com um probleminha ao precisar inserir mais de um registro no banco de uma vez.

A solução que eu procurava era para ter o seguinte efeito:

INSERT INTO tabela (titulo,created) VALUES ('11111', '2009-09-28 17:05:03');
INSERT INTO tabela (titulo,created) VALUES ('22222', '2009-09-28 17:05:03');
INSERT INTO tabela (titulo,created) VALUES ('33333', '2009-09-28 17:05:03');
INSERT INTO tabela (titulo,created) VALUES ('44444', '2009-09-28 17:05:03');
INSERT INTO tabela (titulo,created) VALUES ('55555', '2009-09-28 17:05:03');

Ou seja, eu precisava inserir uma série de registros de uma vez, sendo que no cakephp, se você escrever $this->Model->save($this->data) para um array com todos os campos, ele salva somente o ultimo registro, resultando em uma única inserção.

Para se ter sucesso nesta situação, seu array deve estar configurado conforme abaixo:
Não precisa estar configurado necessariamente assim, mas a meu ver, é a mais adequada.

array(
     [Model] => array(
          [0] => array(
               [titulo] => '111111'
               [texto] => 'xxxxxxx'
          )
          [2] => array(
               [titulo] => '222222'
               [texto] => 'xxxxxxx'
          )
          [3] => array(
               [titulo] => '333333'
               [texto] => 'xxxxxxx'
         )
     )
)

Em seu controller, você vai seguir a seguinte lógica:

foreach($this->data['Model'] as $item){
          $this->Model->save($item);
          $this->Model->id = null;
}

Explicando:
Linha 1: Passamos um foreach no array $this->data['Model']. Usamos este array para cair direto no array útil para este recurso que é o array Model.
Linha 2: Executamos o SAVE no model, normalmente. A diferença é que estaremos pegando o resultado do foreach, ou seja, estaremos pegando um bloco por vez do array e salvando.
Linha 3: É aqui que resolvemos o problema. Ao fim de cada inserção, devemos anular o ID. Se você não anular este ID, o Cakephp irá salvar somente o último insert, isso porque ele vai atribuindo o ID constantemente e no final, ele pega somente o id que está na variavel que é o último.

Essa dica não é daquelas que se acha facilmente na documentação do Cakephp, tão pouco no google, então, está aí a dica. Qualquer dúvida ou outras soluções, pode postar aqui.

Atualização: 29/09/09
Segue a dica do Richard, que é usar o mesmo array mostrado nest post e no save, colocar $this->Model->saveAll($data). Isso já resolve o problema e dispensa o uso do foreach.

Consulte o manual: http://book.cakephp.org/pt/view/75/Saving-Your-Data

6 Responses to 'Cakephp – Inserindo mais de um registro no banco de dados'

  1. 29/09/2009 às 09:31
    Richard@Home
    • 29/09/2009 às 10:21
      Renan Lima
  2. 05/11/2009 às 20:07
    Daniel
    • 06/11/2009 às 07:40
      Renan Lima
  3. 09/11/2009 às 16:31
    Daniel
  4. 25/02/2010 às 10:02
    Tiago

Leave a Reply




XHTML::
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">