Foros del Web » Programando para Internet » PHP » Symfony »

[SOLUCIONADO] Error al insertar en db entidad relacionada

Estas en el tema de Error al insertar en db entidad relacionada en el foro de Symfony en Foros del Web. Hola, tengo un post similar, pero he decidido separar el tema, para no mezclar las churras con las merina :(. El tema es que cuando ...
  #1 (permalink)  
Antiguo 24/11/2014, 09:11
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Error al insertar en db entidad relacionada

Hola, tengo un post similar, pero he decidido separar el tema, para no mezclar las churras con las merina :(.

El tema es que cuando intento trabajar con dos entidade relacionadas me peta el "invento" con este error.

Código PHP:
An exception occurred while executing 'INSERT INTO Branch (book_id, parent_branch, phrase, creator_uid, level) VALUES (?, ?, ?, ?, ?)' with params [{}, null"Write a blog post"41]:

SQLSTATE[23000]: Integrity constraint violation1048 Column 'parent_branch' cannot be null 
Parece claro que los setters de book_id y parent_branch no los hago bien.

Código en cuestión

DefaultController.php


Código PHP:
public function createBranchAction(Request $request$book_id$parent_branch_id) {

    
$em $this->getDoctrine()->getManager();
    
$parent_branch $em->getRepository('BranchMainBundle:Branch')->find(array(
     
'id' => $parent_branch_id
       ));
     
    
// Actual book 
    
$actual_book $em->getRepository('BranchMainBundle:Book')->find($book_id);
  
    
// Presist book
    
$em->persist($actual_book);

    
$parent_level $parent_branch->getLevel();
    if (
$parent_level <= 0){
      
$level 1;
    }else{
      
$level $parent_level 1;
    }
    
// Create new child branch.
    
$branch = new Branch();
    
$branch->setPhrase('Write a blog post');
    
$branch->setBookId($actual_book);
    
$branch->setParentBranch($parent_branch);
    
$branch->setBookId($actual_book);
    
$branch->setLevel($level);
    
// $book->setDueDate(new \DateTime('tomorrow'));
    
$branch->setCreatorUid(1);

    
$form $this->createForm(new NewPhrase(), $branch);
    
$form->handleRequest($request);

    if (
$form->isValid()) {
      
// Save new branch in db.

      
$em $this->getDoctrine()->getManager();
      
$em->persist($branch);
      
$em->flush();

      
//return $this->redirect($this->generateUrl('task_success'));
      
$Message = new Messages;
      return 
$Message->successAction();
    }
    
// Default view.
    
return $this->render('BranchMainBundle:Default:new_branch.html.twig', array(
          
'form' => $form->createView(),
    ));
  } 
Y la entidad en cuestión
Branch.php

Código PHP:
/**
 * Book
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Branch\MainBundle\Entity\BranchRepository")
 */
class Branch {

  
/**
   * @var integer
   *
   * @ORM\Column(name="id", type="integer", nullable=false)
   * @ORM\GeneratedValue(strategy="AUTO")
   * @ORM\Id
   */
  
private $id;

  
/**
   * @var intenger
   * 
   * @ORM\Column(name="book_id", type="integer", nullable=false)
   * @ORM\ManyToOne(targetEntity="Book", inversedBy="Branch")
   */
  
private $book_id;
/*
  public function __construct($book_id) {
    $this->book_id = $book_id; // The book id.
  }
*/
  /**
   * @var integer

   * @ORM\OneToOne(targetEntity="Branch")
   * @ORM\Column(type="integer")
   * @ORM\JoinColumn(name="parent_branch", referencedColumnName="id")
   */
  
private $parent_branch;

  
/**
   * @var string
   * @Assert\NotBlank()
   * @Assert\Length(
   *      min = 10,
   *      max = 500,
   *      minMessage = "Your phrase must be at least {{ limit }} characters long",
   *      maxMessage = "Your phrase cannot be longer than {{ limit }} characters long"
   * ) 
   * @ORM\Column(name="phrase", type="string", length=255)
   */
  
private $phrase;

  
/**
   * @var integer
   * @Assert\NotBlank()
   * @ORM\Column(name="creator_uid", type="integer")
   */
  
private $creatorUid;
  
    
  
  
/**
   * @var integer
   *
   * @ORM\Column(name="level", type="integer")
   */
  
private $level;

  
/**
   * Get book_id
   *
   * @return \Branch\MainBundle\Entity\Book 
   */
  
public function getBookId() {
    return 
$this->book_id;
  }

  
/**
   * Set phrase
   *
   * @param string $phrase
   * @return Book
   */
  
public function setPhrase($phrase) {
    
$this->phrase $phrase;

    return 
$this;
  }

  
/**
   * Get phrase
   *
   * @return string 
   */
  
public function getPhrase() {
    return 
$this->phrase;
  }

  
/**
   * Set parentBranch
   *
   * @param integer $parentBranch
   * @return Branch
   */
  
public function setParentBranch($parentBranch) {
    
$this->parentBranch $parentBranch;

    return 
$this;
  }

  
/**
   * Get parentBranch
   *
   * @return integer 
   */
  
public function getParentBranch() {
    return 
$this->parentBranch;
  }

  
/**
   * Set creatorUid
   *
   * @param integer $creatorUid
   * @return Branch
   */
  
public function setCreatorUid($creatorUid) {
    
$this->creatorUid $creatorUid;

    return 
$this;
  }

  
/**
   * Get creatorUid
   *
   * @return integer 
   */
  
public function getCreatorUid() {
    return 
$this->creatorUid;
  }

  
/**
   * Set book_id
   *
   * @param \Branch\MainBundle\Entity\Book $bookId
   * @return Branch
   */
  
public function setBookId(BranchMainBundleEntityBook $bookId null) {
    
$this->book_id $bookId;

    return 
$this;
  }

Gracias de antemano.
__________________
Videotutoriales de Drupal
  #2 (permalink)  
Antiguo 24/11/2014, 09:19
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 2 meses
Puntos: 89
Respuesta: Error al insertar en db entidad relacionada

Código PHP:
Ver original
  1. $parent_branch = $em->getRepository('BranchMainBundle:Branch')->find(array(
  2.      'id' => $parent_branch_id,
  3.        ));


Esto te esta devolviendo null
__________________
Mono programando!
twitter.com/eguimariano
  #3 (permalink)  
Antiguo 24/11/2014, 09:34
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Respuesta: Error al insertar en db entidad relacionada

Cita:
Iniciado por SirDuque Ver Mensaje
Código PHP:
Ver original
  1. $parent_branch = $em->getRepository('BranchMainBundle:Branch')->find(array(
  2.      'id' => $parent_branch_id,
  3.        ));


Esto te esta devolviendo null
Ok, pero no comprendo porqué.
Si por ejemplo le paso el valor 1, que es la id de un branch que existe en la bd, me sucede lo mismo:
Código PHP:
Ver original
  1. $parent_branch = $em->getRepository('BranchMainBundle:Branch')->find(array(
  2.    'id' => 1,
  3.     // 'book_id' => $book_id
  4.        ));
esa idea garantizo que si existe, ¿cómo puede devolver null?.

Acabado de comprobar con var_dump, que no devuelve null sino esto:
Código PHP:
Ver original
  1. private 'id' => int 1
  2.   private 'book_id' => int 1
  3.   private 'parent_branch' => int 0
  4.   private 'phrase' => string 'Es la primera rama' (length=18)
  5.   private 'creatorUid' => int 1
  6.   private 'level' => int 0
Gracias
__________________
Videotutoriales de Drupal
  #4 (permalink)  
Antiguo 24/11/2014, 09:42
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 2 meses
Puntos: 89
Respuesta: Error al insertar en db entidad relacionada

Proba con esto:
Código PHP:

$parent_branch 
$em->getRepository('BranchMainBundle:Branch')->findOneBy(array('id' => 1));
if(!
$parent_branch)
    die(
'No se encontro un registro con id 1'); 

Eso te va a traer de la entidad Branch el row con id = 1;

Si no te devuelve nada, fijate que exista un registro con id = 1.
__________________
Mono programando!
twitter.com/eguimariano
  #5 (permalink)  
Antiguo 24/11/2014, 10:12
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Respuesta: Error al insertar en db entidad relacionada

Cita:
Iniciado por SirDuque Ver Mensaje
Proba con esto:
Código PHP:

$parent_branch 
$em->getRepository('BranchMainBundle:Branch')->findOneBy(array('id' => 1));
if(!
$parent_branch)
    die(
'No se encontro un registro con id 1'); 

Eso te va a traer de la entidad Branch el row con id = 1;

Si no te devuelve nada, fijate que exista un registro con id = 1.
Como te comentaba antes, si haces un var_dump es suficiente para ver que si existe esa tupla en la bd, de hecho la veo en Phpmyadmin, por lo que te aseguro que el find devuelve un objeto correctamente, el error tiene que ser otro :).
__________________
Videotutoriales de Drupal
  #6 (permalink)  
Antiguo 24/11/2014, 10:19
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 2 meses
Puntos: 89
Respuesta: Error al insertar en db entidad relacionada

Perdon lei mal el Post....

Fijate dentro del if $form->isValid() si el getParentBranch() devuelve null, antes del persist. Si devuelve null, fijate el $form la estaria seteando en null.
__________________
Mono programando!
twitter.com/eguimariano
  #7 (permalink)  
Antiguo 24/11/2014, 10:35
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Respuesta: Error al insertar en db entidad relacionada

Cita:
Iniciado por SirDuque Ver Mensaje
Perdon lei mal el Post....

Fijate dentro del if $form->isValid() si el getParentBranch() devuelve null, antes del persist. Si devuelve null, fijate el $form la estaria seteando en null.
He borrado todos los setters y getters de la entidad BRANCH, y los he creado por consola nuevamente, ahora parece funcionar, algo había mal en los setters, pero no sabría por desgracia decir que es lo que era .

Falsa alarma, sigue petando:

Cita:
An exception occurred while executing 'INSERT INTO Branch (book_id, parent_branch, phrase, creator_uid, level) VALUES (?, ?, ?, ?, ?)' with params [{}, {}, "una rama nueva", 22, 1]:
Si hago dentro del $form_isValid() un var_dump($branch); obtengo esto:
Cita:
object(Branch\MainBundle\Entity\Branch)[352] private 'id' => null private 'book_id' => object(Branch\MainBundle\Entity\Book)[354] protected 'branches' => object(Doctrine\ORM\PersistentCollection)[355] private 'snapshot' => array (size=0) ... private 'owner' => &object(Branch\MainBundle\Entity\Book)[354] private 'association' => array (size=15) ... private 'em' => object(Doctrine\ORM\EntityManager)[277] ... private 'backRefFieldName' => string 'book' (length=4) private 'typeClass' => object(Doctrine\ORM\Mapping\ClassMetadata)[287] ... private 'isDirty' => boolean false private 'initialized' => boolean false private 'coll' => object(Doctrine\Common\Collections\ArrayCollection )[356] ... private 'id' => int 1 private 'title' => string 'Eres se una vez un libro público escrito por lo habitantes de un planeta llamado tierra.' (length=89) private 'description' => string 'Libro público escrito por todas las personas que lo desean.' (length=60) private 'public' => int 1 private 'maxLevel' => int 1 private 'parent_branch' => object(Branch\MainBundle\Entity\Branch)[326] private 'id' => int 1 private 'book_id' => int 1 private 'parent_branch' => int 0 private 'phrase' => string 'Es la primera rama' (length=18) private 'creatorUid' => int 1 private 'level' => int 0 private 'phrase' => string 'Es la primera rama' (length=18) private 'creatorUid' => int 1 private 'level' => int 1
La clase que genera el form es esta (igual esto es lo que está mal).

Código PHP:
Ver original
  1. <?php
  2.  
  3. // src/Branch/MainBundle/Form/Phrase/NewPhrase.php
  4. namespace Branch\MainBundle\Form\Phrase;
  5.  
  6. use Symfony\Component\Form\AbstractType;
  7. use Symfony\Component\Form\FormBuilderInterface;
  8.  
  9. class NewPhrase extends AbstractType
  10. {
  11.     public function buildForm(FormBuilderInterface $builder, array $options)
  12.     {
  13.         $builder
  14.             ->add('phrase', 'text', array('label'  => 'My phrase', 'max_length' => 500))
  15.             ->add('parentBranch', 'entity', array(
  16.             'class' => 'BranchMainBundle:Branch',
  17.             ))
  18.  
  19.             ->add('bookId', 'entity', array(
  20.             'class' => 'BranchMainBundle:Book',
  21.             ))
  22.            
  23.             ->add('creatorUid', 'integer')
  24.             ->add('save', 'submit');
  25.     }
  26.  
  27.     // unique identifier for this form.
  28.     public function getName()
  29.     {
  30.         return 'phrase';
  31.     }
  32. }
Mil gracias
__________________
Videotutoriales de Drupal

Última edición por Dundee; 24/11/2014 a las 10:41
  #8 (permalink)  
Antiguo 24/11/2014, 11:08
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 2 meses
Puntos: 89
Respuesta: Error al insertar en db entidad relacionada

Mostrame el Error Mysql, por que ahora no esta poniendo un null en parentBranch. Mostrame el error completo.
__________________
Mono programando!
twitter.com/eguimariano
  #9 (permalink)  
Antiguo 24/11/2014, 12:35
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Respuesta: Error al insertar en db entidad relacionada

Cita:
Iniciado por SirDuque Ver Mensaje
Mostrame el Error Mysql, por que ahora no esta poniendo un null en parentBranch. Mostrame el error completo.
Código:
An exception occurred while executing 'INSERT INTO Branch (book_id, parent_branch, phrase, creator_uid, level) VALUES (?, ?, ?, ?, ?)' with params [{}, {}, "Es la primera rama", 1, 1]:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0' for key 'PRIMARY'
__________________
Videotutoriales de Drupal
  #10 (permalink)  
Antiguo 24/11/2014, 12:59
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 2 meses
Puntos: 89
Respuesta: Error al insertar en db entidad relacionada

fijate si la Base de datos esta sincronizada con tu codigo:

app/console doctrine:schema:update --dump-sql


si esta ok, mostrame como quedo finalmente la entidad Branch


Saludos!
__________________
Mono programando!
twitter.com/eguimariano
  #11 (permalink)  
Antiguo 24/11/2014, 13:12
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Respuesta: Error al insertar en db entidad relacionada

Cita:
Iniciado por SirDuque Ver Mensaje
fijate si la Base de datos esta sincronizada con tu codigo:

app/console doctrine:schema:update --dump-sql


si esta ok, mostrame como quedo finalmente la entidad Branch


Saludos!
Efectivamente SirDuque, tenías toda la razón, el caso es que el AutoIncremente en ID no estaba "puesto" en la columna ID de la tabla Branch:

Código PHP:
r45b@rsssbuntu:~/html/piramidalapp/console doctrine:schema:update --force
Updating database schema
...
Database schema updated successfully"1" queries were executed 
Ahora si tira, mil gracias, he aprendido un montón.
__________________
Videotutoriales de Drupal

Etiquetas: entidad
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:25.