Doctrine erreur entités
Résolu
link897
-
francois -
francois -
A voir également:
- Binding entities to query parameters only allowed for entities that have an identifier.
- Downloader for pc - Télécharger - Téléchargement & Transfert
- Power query download - Télécharger - Tableur
- Qwerty to azerty - Guide
- Comment déverrouiller my eyes only sans code - Forum Snapchat
- I'm sorry to have to inform you that your message could not be delivered to one or more recipients. it's attached below. ✓ - Forum Mail
3 réponses
Bonjour,
la méthode find() attend un ID (valeur de la clé primaire, qui par défaut est un entier incrémental) et pas autre chose !
Donc, si la valeur de $session->get('commande') est autre chose que celle d'un ID alors c'est normal que cela engendre une erreur.
Admettons que tu as un ID (entier incrémental) et que chaque entité possède un numéro de commande "$numeroCmde" et que $session->get('commande') correspond ce numéro de commande alors il faudra utiliser :
findByNumeroCmde($session->get('commande'))
ou
findBy(array('numeroCmde' => $session->get('commande')));
la méthode find() attend un ID (valeur de la clé primaire, qui par défaut est un entier incrémental) et pas autre chose !
Donc, si la valeur de $session->get('commande') est autre chose que celle d'un ID alors c'est normal que cela engendre une erreur.
Admettons que tu as un ID (entier incrémental) et que chaque entité possède un numéro de commande "$numeroCmde" et que $session->get('commande') correspond ce numéro de commande alors il faudra utiliser :
findByNumeroCmde($session->get('commande'))
ou
findBy(array('numeroCmde' => $session->get('commande')));
Salut,
Merci pour ta réponse, j'ai fait la manipulation et je n'ai plus le message d'erreur.
Cependant je ne récupère rien dans ma variable $commande ni dans $prepareCommande
PanierController:
CommandesController:
Merci pour ta réponse, j'ai fait la manipulation et je n'ai plus le message d'erreur.
Cependant je ne récupère rien dans ma variable $commande ni dans $prepareCommande
PanierController:
<?php namespace Ecommerce\EcommerceBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\RedirectResponse; use Ecommerce\EcommerceBundle\Form\UtilisateursAdressesType; use Ecommerce\EcommerceBundle\Entity\UtilisateursAdresses; class PanierController extends Controller { public function menuAction() { $session = $this->getRequest()->getSession(); if (!$session->has('panier')) $articles = 0; else $articles = count($session->get('panier')); return $this->render('EcommerceBundle:Default:panier/modulesUsed/panier.html.twig', array('articles' => $articles)); } public function supprimerAction($id) { $session = $this->getRequest()->getSession(); $panier = $session->get('panier'); if (array_key_exists($id, $panier)) { unset($panier[$id]); $session->set('panier',$panier); $this->get('session')->getFlashBag()->add('success','Article supprimé avec succès'); } return $this->redirect($this->generateUrl('panier')); } public function ajouterAction($id) { $session = $this->getRequest()->getSession(); if (!$session->has('panier')) $session->set('panier',array()); $panier = $session->get('panier'); if (array_key_exists($id, $panier)) { if ($this->getRequest()->query->get('qte') != null) $panier[$id] = $this->getRequest()->query->get('qte'); $this->get('session')->getFlashBag()->add('success','Quantité modifié avec succès'); } else { if ($this->getRequest()->query->get('qte') != null) $panier[$id] = $this->getRequest()->query->get('qte'); else $panier[$id] = 1; $this->get('session')->getFlashBag()->add('success','Article ajouté avec succès'); } $session->set('panier',$panier); return $this->redirect($this->generateUrl('panier')); } public function panierAction() { $session = $this->getRequest()->getSession(); if (!$session->has('panier')) $session->set('panier', array()); $em = $this->getDoctrine()->getManager(); $produits = $em->getRepository('EcommerceBundle:Produits')->findArray(array_keys($session->get('panier'))); return $this->render('EcommerceBundle:Default:panier/layout/panier.html.twig', array('produits' => $produits, 'panier' => $session->get('panier'))); } public function adresseSuppressionAction($id) { $em = $this->getDoctrine()->getManager(); $entity = $em->getRepository('EcommerceBundle:UtilisateursAdresses')->find($id); if ($this->container->get('security.context')->getToken()->getUser() != $entity->getUtilisateur() || !$entity) return $this->redirect ($this->generateUrl ('livraison')); $em->remove($entity); $em->flush(); return $this->redirect ($this->generateUrl ('livraison')); } public function livraisonAction() { $utilisateur = $this->container->get('security.context')->getToken()->getUser(); $entity = new UtilisateursAdresses(); $form = $this->createForm(new UtilisateursAdressesType(), $entity); if ($this->get('request')->getMethod() == 'POST') { $form->handleRequest($this->getRequest()); if ($form->isValid()) { $em = $this->getDoctrine()->getManager(); $entity->setUtilisateur($utilisateur); $em->persist($entity); $em->flush(); return $this->redirect($this->generateUrl('livraison')); } } return $this->render('EcommerceBundle:Default:panier/layout/livraison.html.twig', array('utilisateur' => $utilisateur, 'form' => $form->createView())); } public function setLivraisonOnSession() { $session = $this->getRequest()->getSession(); if (!$session->has('adresse')) $session->set('adresse',array()); $adresse = $session->get('adresse'); if ($this->getRequest()->request->get('livraison') != null && $this->getRequest()->request->get('facturation') != null) { $adresse['livraison'] = $this->getRequest()->request->get('livraison'); $adresse['facturation'] = $this->getRequest()->request->get('facturation'); } else { return $this->redirect($this->generateUrl('validation')); } $session->set('adresse',$adresse); return $this->redirect($this->generateUrl('validation')); } public function validationAction() { if ($this->get('request')->getMethod() == 'POST') $this->setLivraisonOnSession(); $em = $this->getDoctrine()->getManager(); $prepareCommande = $this->forward('EcommerceBundle:Commandes:prepareCommande'); $commande = $em->getRepository('EcommerceBundle:Commandes')->find($prepareCommande->getContent()); return $this->render('EcommerceBundle:Default:panier/layout/validation.html.twig', array('commande' => $commande)); }
CommandesController:
<?php namespace Ecommerce\EcommerceBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Response; use Ecommerce\EcommerceBundle\Entity\UtilisateursAdresses; use Ecommerce\EcommerceBundle\Entity\Commandes; use Ecommerce\EcommerceBundle\Entity\Produits; class CommandesController extends Controller { public function facture() { $em = $this->getDoctrine()->getManager(); $generator = $this->container->get('security.secure_random'); $session = $this->getRequest()->getSession(); $adresse = $session->get('adresse'); $panier = $session->get('panier'); $commande = array(); $totalHT = 0; $totalTTC = 0; $facturation = $em->getRepository('EcommerceBundle:UtilisateursAdresses')->find($adresse['facturation']); $livraison = $em->getRepository('EcommerceBundle:UtilisateursAdresses')->find($adresse['livraison']); $produits = $em->getRepository('EcommerceBundle:Produits')->findArray(array_keys($session->get('panier'))); foreach($produits as $produit) { $prixHT = ($produit->getPrix() * $panier[$produit->getId()]); $prixTTC = ($produit->getPrix() * $panier[$produit->getId()] / $produit->getTva()->getMultiplicate()); $totalHT += $prixHT; $totalTTC += $prixTTC; if (!isset($commande['tva']['%'.$produit->getTva()->getValeur()])) $commande['tva']['%'.$produit->getTva()->getValeur()] = round($prixTTC - $prixHT,2); else $commande['tva']['%'.$produit->getTva()->getValeur()] += round($prixTTC - $prixHT,2); $commande['produit'][$produit->getId()] = array('reference' => $produit->getNom(), 'quantite' => $panier[$produit->getId()], 'prixHT' => round($produit->getPrix(),2), 'prixTTC' => round($produit->getPrix() / $produit->getTva()->getMultiplicate(),2)); } $commande['livraison'] = array('prenom' => $livraison->getPrenom(), 'nom' => $livraison->getNom(), 'telephone' => $livraison->getTelephone(), 'adresse' => $livraison->getAdresse(), 'cp' => $livraison->getCp(), 'ville' => $livraison->getVille(), 'pays' => $livraison->getPays(), 'complement' => $livraison->getComplement()); $commande['facturation'] = array('prenom' => $facturation->getPrenom(), 'nom' => $facturation->getNom(), 'telephone' => $facturation->getTelephone(), 'adresse' => $facturation->getAdresse(), 'cp' => $facturation->getCp(), 'ville' => $facturation->getVille(), 'pays' => $facturation->getPays(), 'complement' => $facturation->getComplement()); $commande['prixHT'] = round($totalHT,2); $commande['prixTTC'] = round($totalTTC,2); $commande['token'] = bin2hex($generator->nextBytes(20)); return $commande; } public function prepareCommandeAction() { $session = $this->getRequest()->getSession(); $em = $this->getDoctrine()->getManager(); if (!$session->has('commande')) $commande = new Commandes(); else $commande = $em->getRepository('EcommerceBundle:Commandes')->findBy(array('id' => $session->get('commande'))); $commande->setDate(new \DateTime()); $commande->setUtilisateur($this->container->get('security.context')->getToken()->getUser()); $commande->setValider(0); $commande->setReference(0); $commande->setCommande($this->facture()); if (!$session->has('commande')) { $em->persist($commande); $session->set('commande',$commande); } $em->flush(); return new Response($commande->getId()); }}
En fait, les find() et findBy() te renvoient une collection d'entité et pas une entité.
Pour accéder directement à l'entité (la première entité de la collection), il suffit de remplacer find() par findOne() et findBy() par findOneBy()
L'erreur concerne la ligne suivante:
$commande = $em->getRepository('EcommerceBundle:Commandes')->findBy(array('id' => $session->get('commande')));
il suffisait d'appeler findOnBy():
$commande = $em->getRepository('EcommerceBundle:Commandes')->findOneBy(array('id' => $session->get('commande')));
Pour accéder directement à l'entité (la première entité de la collection), il suffit de remplacer find() par findOne() et findBy() par findOneBy()
L'erreur concerne la ligne suivante:
$commande = $em->getRepository('EcommerceBundle:Commandes')->findBy(array('id' => $session->get('commande')));
il suffisait d'appeler findOnBy():
$commande = $em->getRepository('EcommerceBundle:Commandes')->findOneBy(array('id' => $session->get('commande')));
Pour conclure, il faut impérativement comprendre les erreurs et pas uniquement appliquer un correctif qu'on ne comprend qu'à peine.
Sinon, c'est se cacher un bogue comme on met la poussière sous le tapis : la poussière est toujours là et peut à tout moment venir corrompre l'ensemble du développement.
Sinon, c'est se cacher un bogue comme on met la poussière sous le tapis : la poussière est toujours là et peut à tout moment venir corrompre l'ensemble du développement.