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

Popularity: 21%