CakePHP-Fr.Org

Forum francophone du Framework CakePHP

Vous n'êtes pas identifié.

#1 05-11-2015 17:31:24

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 381

cakephp 3.x saveAll

Comment on fait un saveAll avec la v3 ?

Code: php

  1. $fichiers = $this->Fichiers->find('all', [
  2.             'contain' => []
  3.         ]);
  4. if ($this->request->is(['patch', 'post', 'put'])) {
  5.           $fichiers = TableRegistry::get('Fichiers');
  6.           $entities = $fichiers->newEntities($this->request->data());
  7.       foreach ($entities as $entity) {
  8.         $fichiers->save($entity)
  9.       }
  10.         }

Marche pas sad

Dernière modification par 6120 (06-11-2015 09:19:08)

Hors ligne

 

#2 07-11-2015 15:20:14

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 381

Re: cakephp 3.x saveAll

Donc personne ne sait faire ?
Sur stackoverflow personne n'a donné de réponse satisfaisante.
Le cookbook est à côté de la plaque à ce sujet.
Je n'ai pas progressé depuis mon message précédent.

Je vais le faire "à l'ancienne" pour le moment cad en php pur sans passer par l'orm de cake.

Hors ligne

 

#3 08-11-2015 08:29:49

s13
Fraisier
Date d'inscription: 28-01-2011
Messages: 64

Re: cakephp 3.x saveAll

Il n'y a pas de méthode saveAll pour le moment on dirait bien et j'ai été obligé de faire pareil que toi : avec le foreach. A la limite, tu peux utiliser une transaction, mais je reconnais que ca ne change pas grand chose et que ca peut pondre un grand nombre de requête.


-
Join us: irc.freenode.net #cakephp-fr

Hors ligne

 

#4 09-11-2015 10:43:13

cyberbobjr
Baker
Date d'inscription: 13-07-2010
Messages: 625

Re: cakephp 3.x saveAll

salut,
normalement cela fonctionne, très bien même, tu as regardé ton request->data pour savoir ce qu'il contenait avant la sauvegarde ?
a++


Développeur freelance et disponible, contactez-moi en privé.
Mon blog CakePHP : http://caketuts.key-conseil.fr

Hors ligne

 

#5 09-11-2015 13:39:51

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 381

Re: cakephp 3.x saveAll

Oui bien sûr :

Code: php

  1. [
  2.   'Articles' => [
  3.     (int) 1 => [
  4.       'id' => '3',
  5.       'order' => '0'
  6.     ],
  7.     (int) 0 => [
  8.       'id' => '2',
  9.       'order' => '1'
  10.     ],
  11.     (int) 2 => [
  12.       'id' => '4',
  13.       'order' => '2'
  14.     ]
  15.   ]
  16. ]

Hors ligne

 

#6 09-11-2015 15:53:07

cyberbobjr
Baker
Date d'inscription: 13-07-2010
Messages: 625

Re: cakephp 3.x saveAll

Il me semble que si ton tableau est indexé par Articles, alors ta table devrait s'appeler Articles, et non Fichiers:

Code: php

  1. $fichiers = TableRegistry::get('Fichiers');

=>

Code: php

  1. $fichiers = TableRegistry::get('Articles');

Développeur freelance et disponible, contactez-moi en privé.
Mon blog CakePHP : http://caketuts.key-conseil.fr

Hors ligne

 

#7 09-11-2015 15:59:09

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 381

Re: cakephp 3.x saveAll

Désolé pour la confusion.
C'est parce que j'ai 2 tables (et donc 2 controllers) avec la même méthode.

J'ai bien 'Fichiers' dans le premier cas et 'Articles' dans le deuxième.

Le problème ne vient pas de là.

Ce qui est étrange, c'est que je n'ai pas de message d'erreur.

Dernière modification par 6120 (09-11-2015 16:02:52)

Hors ligne

 

#8 09-11-2015 17:58:58

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 381

Re: cakephp 3.x saveAll

Je viens de faire un debug sur "entities" :

Code: php

  1. [
  2.   (int) 0 => object(App\Model\Entity\Fichier) {
  3.  
  4.     (int) 1 => [
  5.       'category_id' => '2',
  6.       'name' => 'Niveau 1',
  7.       'order' => '0'
  8.     ],
  9.     (int) 2 => [
  10.       'category_id' => '2',
  11.       'name' => 'Paris Brest',
  12.       'order' => '1'
  13.     ],
  14.     (int) 0 => [
  15.       'category_id' => '2',
  16.       'name' => 'Test 678',
  17.       'order' => '2'
  18.     ],
  19.     '[new]' => true,
  20.     '[accessible]' => [
  21.       '*' => true
  22.     ],
  23.     '[dirty]' => [
  24.       (int) 1 => true,
  25.       (int) 2 => true,
  26.       (int) 0 => true
  27.     ],
  28.     '[original]' => [],
  29.     '[virtual]' => [],
  30.     '[errors]' => [
  31.       'category_id' => [
  32.         '_required' => 'Ce champ est obligatoire'
  33.       ],
  34.       'name' => [
  35.         '_required' => 'Ce champ est obligatoire'
  36.       ],
  37.     ],
  38.     '[repository]' => 'Fichiers'
  39.  
  40.   }
  41. ]

Dernière modification par 6120 (10-11-2015 23:30:27)

Hors ligne

 

#9 15-11-2015 15:07:36

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 381

Re: cakephp 3.x saveAll

J'aimerais quand même comprendre pourquoi ceci ne marche pas :

Code: php

  1. $this->request->data :
  2. [
  3.   (int) 0 => [
  4.     'id' => '2',
  5.     'category_id' => '2',
  6.     'name' => 'Test 678',
  7.     'order' => '2'
  8.   ],
  9.   (int) 1 => [
  10.     'id' => '3',
  11.     'category_id' => '2',
  12.     'name' => 'Niveau 1',
  13.     'order' => '0'
  14.   ],
  15.   (int) 2 => [
  16.     'id' => '4',
  17.     'category_id' => '2',
  18.     'name' => 'Test #98',
  19.     'order' => '1'
  20.   ]
  21. ]
  22.  
  23.  
  24. if ($this->request->is(['patch', 'post', 'put'])) {
  25.   $items = $this->request->data;
  26.   foreach($items as $item) {
  27.     $articleId = $item['id'];
  28.     $selected_article = $this->Articles->get($articleId);
  29.       $selected_article = $this->Articles->patchEntity($selected_article, $item);
  30.       if ($this->Articles->save($selected_article)) {
  31.                 $saved = true;
  32.       } else {
  33.     $success = false;
  34.             }
  35.   }
  36. }

erreur retournée :
SQLSTATE[42000]: Syntax error or access violation: 1064

Dernière modification par 6120 (15-11-2015 15:10:28)

Hors ligne

 

#10 16-11-2015 00:00:53

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 381

Re: cakephp 3.x saveAll

Éléments de réponse :
après plusieurs jours de prise de tête, voici quelques éléments pour aider ceux qui seront confrontés à ce problème.

1) j'avais une colonne "order" dans ma table mais il semble que cake 3 + mysql n'aiment pas ce nom. (Ok, c'est un nom réservé dans mysql mais sans cake, ça marche très bien)
2) ce qui est indiqué dans le cookbook ne marche pas
3) cyberbobjr prétend que ça marche "très bien même" mais ne donne aucune solution. Soit il n'a pas bien compris la question, soit il ne veut pas partager ses connaissances  sad mais c'est dommage
4) voici une solution qui marche bien :

Code: php

  1. if ($this->request->is(['patch', 'post', 'put'])) {
  2.     $items = $this->request->data;
  3.   foreach($items as $item) {
  4.     $articleId = $item['id'];
  5.     $selected_article = $this->Articles->get($articleId);
  6.       $selected_article = $this->Articles->patchEntity($selected_article, $item);
  7.       if ($this->Articles->save($selected_article)) {
  8.             /* ... */
  9.     } else {
  10.       /* ... */
  11.         }
  12.   }
  13. }

En espérant que ce sera utile à d'autres.

Dernière modification par 6120 (16-11-2015 00:14:01)

Hors ligne

 

#11 16-11-2015 09:35:45

cake17
Cooker
Date d'inscription: 29-03-2012
Messages: 382
Site web

Re: cakephp 3.x saveAll

@6120, @cyberbobjr prend le temps de te répondre et essaie gentiment de trouver une solution à tes questions. Evite de t'en prendre aux gens qui essaient de t'aider, ça ne donne pas envie de t'aider.

Content que tu aies tout de même trouver une solution à ton problème smile

Hors ligne

 

#12 16-11-2015 10:48:28

cyberbobjr
Baker
Date d'inscription: 13-07-2010
Messages: 625

Re: cakephp 3.x saveAll

Salut,
désolé de t'avoir déçu, mais dans mes projets lorsque je fais un save dans une boucle, je n'ai pas de soucis particulier hmm
Idem pour le hasMany, je n'ai jamais rencontré de problème, même les belongsToMany c'est peu dire smile j'ai suivi "simplement" le book, ou pour un de mes derniers projet j'ai laissé faire le bake model et template smile qui m'a donné d'excellents fichiers tables et template. Mais à ma décharge, l’ingénieur qui bosse avec moi m'avait fourni un modèle en or 18K : toutes les clefs étrangères étaient identifées dans MySQL, à partir de là bake fait très bien le boulot.


Développeur freelance et disponible, contactez-moi en privé.
Mon blog CakePHP : http://caketuts.key-conseil.fr

Hors ligne

 

#13 16-11-2015 11:19:23

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 381

Re: cakephp 3.x saveAll

Au moins j'ai fait réagir !
On commençait à s'ennuyer sur ce forum smile

cake17, cyberbobjr : c'était pas méchant smile juste de la déception.
Je pense que ce n'est pas très cool de répondre "je sais et pas toi" smile mais bon, on n'a pas toujours le temps qu'on voudrait ...
cake17 je sais ce que c'est que d'aider les autres, regarde mes posts, je crois que je joue le jeu honnêtement. Je me suis fixé comme principe de toujours essayer d'aider quelqu'un après avoir moi-même demandé de l'aide, voire avant. Et sans vérifier, je suis à peu près sûr d'avoir participé plus dans le sens de l'aide que de la demande.

J'étais un peu énervé sur le coup, je suis désolé pour ma saute d'humeur.
-- fermeture de ce chapitre => si on se croise c'est moi qui paye l'apéro -- smile

Pour en finir avec ce problème, j'ai aussi galèré parce que le formulaire qui envoie les données n'est plus le même que dans cake 2.x.

Dans cakephp 2.x il fallait faire :

Code: php

  1. $line = 0;
  2. foreach ($articles as $article) {
  3.   echo '<tr>';
  4.   echo $this->Form->input('Article.' . $line . '.id', ['type' => 'hidden']);
  5.   echo '<td>' . $this->Form->input('Article.' . $line . '.name') . '</td>';
  6.   echo '<td>' . $this->Form->input('Article.' . $line . '.ordre', ['label' => '']);
  7.   echo '</td>';
  8.   echo '</tr>';
  9.   $line ++;
  10. }

Avec cakephp 3.x il faut désormais écrire :

Code: php

  1. $line = 0;
  2. foreach ($articles as $article) {
  3.   echo '<tr>';
  4.   echo $this->Form->input($line '.id', ['type' => 'hidden']);
  5.   echo '<td>' . $this->Form->input($line . '.name') . '</td>';
  6.   echo '<td>' . $this->Form->input($line . '.ordre', ['label' => '']);
  7.   echo '</td>';
  8.   echo '</tr>';
  9.   $line ++;
  10. }

c'est à dire qu'il faut supprimer la référence à la table : 'Article.' dans chaque ligne.

Dernière modification par 6120 (16-11-2015 11:29:57)

Hors ligne

 

#14 16-11-2015 11:28:59

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 381

Re: cakephp 3.x saveAll

Pour compléter le post précédent, si le cookbook avait été clair je n'aurais eu aucun soucis.
C'est quelque chose que j'ai fait des centaines de fois dans cake 2.x donc je connais. Il y avait dans cake 2.x une fonction saveAll bien pratique.

Ensuite, faire une boucle en répétant la même commande, bon, ça va ...

Le soucis est que je voulais le faire comme indiqué dans le cookbook en pensant que ce serait mieux : mauvaise idée.

Mes conclusions :
1) le nouvel ORM est une usine à gaz de type symphony et ce n'est pas rassurant.
2) le cookbook comporte énormément d'approximations ou de bouts d'exemples incomplets qui n'aident pas à appréhender cake 3.

Hors ligne

 

#15 16-11-2015 12:42:23

cake17
Cooker
Date d'inscription: 29-03-2012
Messages: 382
Site web

Re: cakephp 3.x saveAll

@6120 Pas de soucis non plus de mon côté, je sais que tu aides beaucoup de gens aussi !! Et j'attends la bière !! smile

C'était juste histoire de rappeler que le projet est communautaire et libre, donc si quelque chose n'existe pas ou est mal expliqué, une Pull Request sur github est la bienvenue ! Les gens donnent de leur temps pour écrire la doc et créer cet outil, et en plus ils acceptent les améliorations et les intègrent le plus souvent. Donc autant aider et participer pour le rendre encore meilleur et plus compréhensible !

Tiens je viens de tomber sur ça sur [github](https://github.com/cakephp/cakephp/issues/7613) et le dernier message va t'intéresser.

Hors ligne

 

#16 16-11-2015 13:53:04

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 381

Re: cakephp 3.x saveAll

merci pour le lien

Hors ligne

 

#17 17-11-2015 10:10:13

cyberbobjr
Baker
Date d'inscription: 13-07-2010
Messages: 625

Re: cakephp 3.x saveAll

T'inquiète pas, ca peut arriver d'être énervé, d'autant plus que l'ORM de CakePHPv3 nous oblige à revoir notre façon de coder. Moi-même il y'a encore pas mal de choses que je ne comprends pas avec cet ORM, cela va prendre du temps.
bon courage pour la suite !


Développeur freelance et disponible, contactez-moi en privé.
Mon blog CakePHP : http://caketuts.key-conseil.fr

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr