Error de entidades de Doctrine

Resuelto
link897 -  
 francois -
Hola,

hace un día que tengo un problema con un mensaje de error y no encuentro ninguna respuesta en ninguna parte. Seguí un tutorial para aprender Symfony y me encuentro con este mensaje de error:

Uncaught PHP Exception Doctrine\ORM\ORMInvalidArgumentException: "Binding entities to query parameters only allowed for entities that have an identifier." en C:\wamp\www\Project\vendor\doctrine\orm\lib\Doctrine\ORM\ORMInvalidArgumentException.php línea 188
Contexto: { "exception": "Exception(Doctrine\\ORM\\ORMInvalidArgumentException): Binding entities to query parameters only allowed for entities that have an identifier." }


Symfony me dice que proviene de esta línea:
$commande = $em->getRepository('EcommerceBundle:Commande')->find($session->get('commande'));

o de esta:
$prepareCommande = $this->forward('EcommerceBundle:Commandes:prepareCommande',array('request' => $request));


Gracias de antemano
Configuración: Windows / Chrome 57.0.2987.133

3 respuestas

  1. Zempachi Mensajes publicados 7572 Estado Colaborador 906
     
    Hola,

    ¡el método find() espera un ID (valor de la clave primaria, que por defecto es un entero incremental) y no otra cosa!
    Así que, si el valor de $session->get('commande') es algo diferente a un ID, entonces es normal que esto cause un error.
    Supongamos que tienes un ID (entero incremental) y que cada entidad tiene un número de pedido ""$numeroCmde" y que $session->get('commande') corresponde a este número de pedido, entonces deberías usar:
    findByNumeroCmde($session->get('commande'))
    o
    findBy(array('numeroCmde' => $session->get('commande')));

    --
    ¡no, no, no se puede!
    Miembro fundador del FJH
    v(^_^)v
    0
  2. link897
     
    Salut,

    Gracias por tu respuesta, hice la manipulación y ya no tengo el mensaje de error.
    Sin embargo, no recupero nada en mi variable $commande ni en $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','Artículo eliminado con éxito'); } 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','Cantidad modificada con éxito'); } 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','Artículo agregado con éxito'); } $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('referencia' => $produit->getNom(), 'cantidad' => $panier[$produit->getId()], 'precioHT' => round($produit->getPrix(),2), 'precioTTC' => round($produit->getPrix() / $produit->getTva()->getMultiplicate(),2)); } $commande['livraison'] = array('prenom' => $livraison->getPrenom(), 'nom' => $livraison->getNom(), 'telefono' => $livraison->getTelephone(), 'direccion' => $livraison->getAdresse(), 'cp' => $livraison->getCp(), 'ciudad' => $livraison->getVille(), 'pays' => $livraison->getPays(), 'complemento' => $livraison->getComplement()); $commande['facturacion'] = array('prenom' => $facturation->getPrenom(), 'nom' => $facturation->getNom(), 'telefono' => $facturation->getTelephone(), 'direccion' => $facturation->getAdresse(), 'cp' => $facturation->getCp(), 'ciudad' => $facturation->getVille(), 'pays' => $facturation->getPays(), 'complemento' => $facturation->getComplement()); $commande['precioHT'] = round($totalHT,2); $commande['precioTTC'] = 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()); }}
    0
    1. link897
       
      Error: Llamada a una función miembro setUtilisateur() en un array
      500 Error Interno del Servidor - FatalErrorException
      0
  3. link897
     
    He resuelto mi problema volviendo a una versión más antigua de Doctrine.
    0
    1. Zempachi Mensajes publicados 7572 Estado Colaborador 906
       
      De hecho, los find() y findBy() te devuelven una colección de entidades y no una entidad.
      Para acceder directamente a la entidad (la primera entidad de la colección), solo tienes que reemplazar find() por findOne() y findBy() por findOneBy()

      El error está en la siguiente línea:
      $commande = $em->getRepository('EcommerceBundle:Commandes')->findBy(array('id' => $session->get('commande')));

      Solo había que llamar a findOneBy():
      $commande = $em->getRepository('EcommerceBundle:Commandes')->findOneBy(array('id' => $session->get('commande')));
      0
    2. Zempachi Mensajes publicados 7572 Estado Colaborador 906
       
      Para concluir, es imperativo entender los errores y no solo aplicar un correctivo que apenas se comprende.
      De lo contrario, es como esconder un bug bajo la alfombra: el polvo siempre está ahí y en cualquier momento puede corromper todo el desarrollo.
      0
    3. francois
       
      Hola, ¿nos puedes dar la solución? Gracias.
      0
    4. francois
       
      med
      0