Hola buenas,
La verdad es que tengo un problema: tengo una aplicación funcionando bien en local, pero ahora que lo subí a un servidor remoto, por alguna extraña razón que aún sigo sin determinar, no puedo guardar información en una tabla específica de la base de datos. Tengo varias tablas pero no puedo hacer guardar información solo en una.
¿Alguna vez le ha pasado a alguien? Agradecería, toda información que puedan darme.
Respuestas
Lo más probable es que en local hayas hecho algún cambio en esa tabla (añadir o eliminar una columna, cambiar alguna opción de alguna columna, etc.) y por eso se produce un error al intentar guardar la información.
Lo mejor que puedes hacer es mirar el archivo de log app/logs/prod.log
donde es casi seguro que verás algún mensaje de error de Doctrine indicando la causa exacta del problema.
@javiereguiluz
@javiereguiluz Gracias por tu pronta respuesta. Fíjate el error que me muestra sólo ratifica lo de que no puedo guardar en esa tabla. Para hacerme entender mejor, use este tutorial maestrosdelweb.com/editorial/curso-symfony2-seguridad-de-acceso/ para guardar usuarios, roles y login.
La tabla que no me está dejando guardar es usuarios
, y me da error porque no puedo guardar el user_rol
, porque no existe el id de usuario
. Repito en local funciona bien.
Agradecería, toda información que puedan darme.
@ponceelrelajado
Lo mejor sería que nos copiaras exactamente las líneas de error que veas en el archivo de log. En cualquier caso, como tú mismo dices el error parece que está relacionado con que no existe el id
del usuario.
Así que si has migrado la información de tu aplicación local, no se han respetado los id
de los registros de la base de datos. Y si has migrado la aplicación pero no la información, entonces te tienes asegurar de que existe ese usuario que estás visualizando o editando.
@javiereguiluz
@javiereguiluz este es el error:
An exception occurred while executing 'INSERT INTO user_role (user_id, role_id) VALUES (?, ?)' with params [0, 2]: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (asptmsh_asptmsh
.user_role
, CONSTRAINTFK_2DE8C6A3A76ED395
FOREIGN KEY (user_id
) REFERENCESadmin_user
(id
))
Lo que estoy intentando hacer es registrar usuarios pero por alguna extraña razón no puedo pero solo en la tabla usuarios. En el resto de las tablas puedo guardar sin inconvenientes. Adjuntaré el código de mi entidad a ver si me pueden ayudar, la verdad ya estoy desesperado:
<?php // proyecto/src/Asap/TimesheetsBundle/Entity/User.php namespace Asap\TimesheetsBundle\Entity; use Symfony\Component\Security\Core\User\UserInterface; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass="Asap\TimesheetsBundle\Entity\UserRepository") * @ORM\Table(name="admin_user") */ class User implements UserInterface { /** * @var integer * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var string * * @ORM\Column(name="idquickbooks", type="string", length=255, nullable=true) */ private $idquickbooks; /** * @var string * * @ORM\Column(name="nombres", type="string", length=255, nullable=false) */ private $nombres; /** * @var string * * @ORM\Column(name="apellidos", type="string", length=255, nullable=false) */ private $apellidos; /** * @var string * * @ORM\Column(name="username", type="string", length=255, nullable=true) */ protected $username; /** * @var string * * @ORM\Column(name="useremail", type="string", length=255, nullable=false) */ private $useremail; /** * @var string * * @ORM\Column(name="password", type="string", length=255, nullable=true) */ protected $password; /** * @var string * * @ORM\Column(name="salt", type="string", length=255, nullable=true) */ protected $salt; /** * @ORM\Column(name="is_active", type="boolean") */ private $isActive; /** * @ORM\OneToMany(targetEntity="Cuentabancaria", mappedBy="usuarioid") */ protected $cuentabancaria_usuario_id; /** * @ORM\OneToMany(targetEntity="Direccion", mappedBy="usuarioid") */ protected $direccion_usuario_id; /** * @ORM\OneToMany(targetEntity="Emails", mappedBy="usuarioid") */ protected $email_usuario_id; /** * @ORM\OneToMany(targetEntity="Empresa", mappedBy="empresausuarioadministradorid") */ protected $empresa_usuario_administrador_id; /** * @ORM\OneToMany(targetEntity="Empresa", mappedBy="empresausuariofacturacionid") */ protected $empresa_usuario_facturacion_id; /** * @ORM\OneToMany(targetEntity="Telefono", mappedBy="usuarioid") */ protected $telefono_usuario_id; /** * @ORM\OneToMany(targetEntity="Timesheet", mappedBy="timesheetusuarioid") */ protected $timesheet_usuario_id; /** * @ORM\OneToMany(targetEntity="LogTimesheets", mappedBy="usuario_creador") */ protected $timesheet_log_usuario_creador; /** * @ORM\OneToMany(targetEntity="LogTimesheets", mappedBy="usuario_modificador") */ protected $timesheet_log_usuario_modificador; /** * @ORM\OneToMany(targetEntity="LogUsers", mappedBy="usuarioid") */ protected $log_usuario_id; /** * @ORM\OneToMany(targetEntity="LogUsers", mappedBy="usuario_modificador_id") */ protected $log_usuario_modificador; /** * @ORM\OneToMany(targetEntity="Usuariorogrupo", mappedBy="usuarioid") */ protected $usuariogrupo_usuario_id; /** * se utilizó user_roles para no hacer conflicto al aplicar ->toArray en getRoles() * @ORM\ManyToMany(targetEntity="Role") * @ORM\JoinTable(name="user_role", * joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")} * ) */ protected $user_roles; public function __construct() { $this->user_roles = new ArrayCollection(); $this->cuentabancaria_usuario_id = new ArrayCollection(); $this->direccion_usuario_id = new ArrayCollection(); $this->email_usuario_id = new ArrayCollection(); $this->empresa_usuario_administrador_id = new ArrayCollection(); $this->empresa_usuario_facturacion_id = new ArrayCollection(); $this->telefono_usuario_id = new ArrayCollection(); $this->timesheet_usuario_id = new ArrayCollection(); $this->timesheet_log_usuario_creador = new ArrayCollection(); $this->timesheet_log_usuario_modificador = new ArrayCollection(); $this->log_usuario_id = new ArrayCollection(); $this->log_usuario_modificador = new ArrayCollection(); $this->usuariogrupo_usuario_id = new ArrayCollection(); $this->isActive = false; } /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set idquickbooks * * @param string $idquickbooks * @return Usuario */ public function setIdquickbooks($idquickbooks) { $this->idquickbooks = $idquickbooks; return $this; } /** * Get nombres * * @return string */ public function getIdquickbooks() { return $this->idquickbooks; } /** * Set nombres * * @param string $nombres * @return Usuario */ public function setNombres($nombres) { $this->nombres = $nombres; return $this; } /** * Get nombres * * @return string */ public function getNombres() { return $this->nombres; } /** * Set apellidos * * @param string $apellidos * @return Usuario */ public function setApellidos($apellidos) { $this->apellidos = $apellidos; return $this; } /** * Get apellidos * * @return string */ public function getApellidos() { return $this->apellidos; } /** * Set username * * @param string $username */ public function setUsername($username) { $this->username = $username; } /** * Get username * * @return string */ public function getUsername() { return $this->username; } /** * Set user_email * * @param string $userEmail * @return Usuario */ public function setUseremail($useremail) { $this->useremail = $useremail; return $this; } /** * Get user_email * * @return string */ public function getUseremail() { return $this->useremail; } /** * Set password * * @param string $password */ public function setPassword($password) { $this->password = $password; } /** * Get password * * @return string */ public function getPassword() { return $this->password; } /** * Set salt * * @param string $salt */ public function setSalt($salt) { $this->salt = $salt; } /** * Get salt * * @return string */ public function getSalt() { return $this->salt; } /** * Add cuentabancaria_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Cuentabancaria $cuentabancariaUsuarioId * @return Usuario */ public function addCuentabancariaUsuarioId(\Asap\TimesheetsBundle\Entity\Cuentabancaria $cuentabancariaUsuarioId) { $this->cuentabancaria_usuario_id[] = $cuentabancariaUsuarioId; return $this; } /** * Remove cuentabancaria_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Cuentabancaria $cuentabancariaUsuarioId */ public function removeCuentabancariaUsuarioId(\Asap\TimesheetsBundle\Entity\Cuentabancaria $cuentabancariaUsuarioId) { $this->cuentabancaria_usuario_id->removeElement($cuentabancariaUsuarioId); } /** * Get cuentabancaria_usuario_id * * @return \Doctrine\Common\Collections\Collection */ public function getCuentabancariaUsuarioId() { return $this->cuentabancaria_usuario_id; } /** * Add direccion_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Direccion $direccionUsuarioId * @return Usuario */ public function addDireccionUsuarioId(\Asap\TimesheetsBundle\Entity\Direccion $direccionUsuarioId) { $this->direccion_usuario_id[] = $direccionUsuarioId; return $this; } /** * Remove direccion_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Direccion $direccionUsuarioId */ public function removeDireccionUsuarioId(\Asap\TimesheetsBundle\Entity\Direccion $direccionUsuarioId) { $this->direccion_usuario_id->removeElement($direccionUsuarioId); } /** * Get direccion_usuario_id * * @return \Doctrine\Common\Collections\Collection */ public function getDireccionUsuarioId() { return $this->direccion_usuario_id; } /** * Add email_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Emails $emailUsuarioId * @return Usuario */ public function addEmailUsuarioId(\Asap\TimesheetsBundle\Entity\Emails $emailUsuarioId) { $this->email_usuario_id[] = $emailUsuarioId; return $this; } /** * Remove email_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Emails $emailUsuarioId */ public function removeEmailUsuarioId(\Asap\TimesheetsBundle\Entity\Emails $emailUsuarioId) { $this->email_usuario_id->removeElement($emailUsuarioId); } /** * Get email_usuario_id * * @return \Doctrine\Common\Collections\Collection */ public function getEmailUsuarioId() { return $this->email_usuario_id; } /** * Add empresa_usuario_administrador_id * * @param \Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioAdministradorId * @return Usuario */ public function addEmpresaUsuarioAdministradorId(\Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioAdministradorId) { $this->empresa_usuario_administrador_id[] = $empresaUsuarioAdministradorId; return $this; } /** * Remove empresa_usuario_administrador_id * * @param \Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioAdministradorId */ public function removeEmpresaUsuarioAdministradorId(\Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioAdministradorId) { $this->empresa_usuario_administrador_id->removeElement($empresaUsuarioAdministradorId); } /** * Get empresa_usuario_administrador_id * * @return \Doctrine\Common\Collections\Collection */ public function getEmpresaUsuarioAdministradorId() { return $this->empresa_usuario_administrador_id; } /** * Add empresa_usuario_facturacion_id * * @param \Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioFacturacionId * @return Usuario */ public function addEmpresaUsuarioFacturacionId(\Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioFacturacionId) { $this->empresa_usuario_facturacion_id[] = $empresaUsuarioFacturacionId; return $this; } /** * Remove empresa_usuario_facturacion_id * * @param \Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioFacturacionId */ public function removeEmpresaUsuarioFacturacionId(\Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioFacturacionId) { $this->empresa_usuario_facturacion_id->removeElement($empresaUsuarioFacturacionId); } /** * Get empresa_usuario_facturacion_id * * @return \Doctrine\Common\Collections\Collection */ public function getEmpresaUsuarioFacturacionId() { return $this->empresa_usuario_facturacion_id; } /** * Add telefono_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Telefono $telefonoUsuarioId * @return Usuario */ public function addTelefonoUsuarioId(\Asap\TimesheetsBundle\Entity\Telefono $telefonoUsuarioId) { $this->telefono_usuario_id[] = $telefonoUsuarioId; return $this; } /** * Remove telefono_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Telefono $telefonoUsuarioId */ public function removeTelefonoUsuarioId(\Asap\TimesheetsBundle\Entity\Telefono $telefonoUsuarioId) { $this->telefono_usuario_id->removeElement($telefonoUsuarioId); } /** * Get telefono_usuario_id * * @return \Doctrine\Common\Collections\Collection */ public function getTelefonoUsuarioId() { return $this->telefono_usuario_id; } /** * Add timesheet_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Timesheet $timesheetUsuarioId * @return Usuario */ public function addTimesheetUsuarioId(\Asap\TimesheetsBundle\Entity\Timesheet $timesheetUsuarioId) { $this->timesheet_usuario_id[] = $timesheetUsuarioId; return $this; } /** * Remove timesheet_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Timesheet $timesheetUsuarioId */ public function removeTimesheetUsuarioId(\Asap\TimesheetsBundle\Entity\Timesheet $timesheetUsuarioId) { $this->timesheet_usuario_id->removeElement($timesheetUsuarioId); } /** * Get timesheet_usuario_id * * @return \Doctrine\Common\Collections\Collection */ public function getTimesheetUsuarioId() { return $this->timesheet_usuario_id; } /** * Add usuariogrupo_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Usuariorogrupo $usuariogrupoUsuarioId * @return Usuario */ public function addUsuariogrupoUsuarioId(\Asap\TimesheetsBundle\Entity\Usuariorogrupo $usuariogrupoUsuarioId) { $this->usuariogrupo_usuario_id[] = $usuariogrupoUsuarioId; return $this; } /** * Remove usuariogrupo_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Usuariorogrupo $usuariogrupoUsuarioId */ public function removeUsuariogrupoUsuarioId(\Asap\TimesheetsBundle\Entity\Usuariorogrupo $usuariogrupoUsuarioId) { $this->usuariogrupo_usuario_id->removeElement($usuariogrupoUsuarioId); } /** * Get usuariogrupo_usuario_id * * @return \Doctrine\Common\Collections\Collection */ public function getUsuariogrupoUsuarioId() { return $this->usuariogrupo_usuario_id; } /** * Add user_roles * * @param Asap\TimesheetsBundle\Entity\Role $userRoles */ public function addRole(\Asap\TimesheetsBundle\Entity\Role $userRoles) { $this->user_roles[] = $userRoles; } public function setUserRoles($roles) { $this->user_roles = $roles; } /** * Set isActive * * @param boolean $isActive * @return Usuario */ public function setIsActive($isActive) { $this->isActive = $isActive; return $this; } /** * Get isActive * * @return boolean */ public function getIsActive() { return $this->isActive; } /** * Add timesheet_log_usuario_creador * * @param \Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioCreador * @return Usuario */ public function addTimesheetLogUsuarioCreador(\Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioCreador) { $this->timesheet_log_usuario_creador[] = $timesheetLogUsuarioCreador; return $this; } /** * Remove timesheet_log_usuario_creador * * @param \Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioCreador */ public function removeTimesheetLogUsuarioCreador(\Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioCreador) { $this->timesheet_log_usuario_creador->removeElement($timesheetLogUsuarioCreador); } /** * Get timesheet_log_usuario_creador * * @return \Doctrine\Common\Collections\Collection */ public function getTimesheetLogUsuarioCreador() { return $this->timesheet_log_usuario_creador; } /** * Add timesheet_log_usuario_modificador * * @param \Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioModificador * @return Usuario */ public function addTimesheetLogUsuarioModificador(\Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioModificador) { $this->timesheet_log_usuario_modificador[] = $timesheetLogUsuarioModificador; return $this; } /** * Remove timesheet_log_usuario_modificador * * @param \Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioModificador */ public function removeTimesheetLogUsuarioModificador(\Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioModificador) { $this->timesheet_log_usuario_modificador->removeElement($timesheetLogUsuarioModificador); } /** * Get timesheet_log_usuario_modificador * * @return \Doctrine\Common\Collections\Collection */ public function getTimesheetLogUsuarioModificador() { return $this->timesheet_log_usuario_modificador; } /** * Add log_usuario_id * * @param \Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioId * @return Usuario */ public function addLogUsuarioId(\Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioId) { $this->log_usuario_id[] = $logUsuarioId; return $this; } /** * Remove log_usuario_id * * @param \Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioId */ public function removeLogUsuarioId(\Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioId) { $this->log_usuario_id->removeElement($logUsuarioId); } /** * Get log_usuario_id * * @return \Doctrine\Common\Collections\Collection */ public function getLogUsuarioId() { return $this->log_usuario_id; } /** * Add log_usuario_modificador * * @param \Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioModificador * @return Usuario */ public function addLogUsuarioModificador(\Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioModificador) { $this->log_usuario_modificador[] = $logUsuarioModificador; return $this; } /** * Remove log_usuario_modificador * * @param \Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioModificador */ public function removeLogUsuarioModificador(\Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioModificador) { $this->log_usuario_modificador->removeElement($logUsuarioModificador); } /** * Get log_usuario_modificador * * @return \Doctrine\Common\Collections\Collection */ public function getLogUsuarioModificador() { return $this->log_usuario_modificador; } /** * Get user_roles * * @return Doctrine\Common\Collections\Collection */ public function getUserRoles() { return $this->user_roles; } /** * Get roles * * @return Doctrine\Common\Collections\Collection */ public function getRoles() { //return $this->user_roles->toArray(); //IMPORTANTE: el mecanismo de seguridad de Sf2 requiere ésto como un array $roles = array(); foreach ($this->user_roles as $role) { $roles[] = $role->getRole(); } return $roles; } /** * Compares this user to another to determine if they are the same. * * @param UserInterface $user The user * @return boolean True if equal, false othwerwise. */ public function equals(UserInterface $user) { return md5($this->getUsername()) == md5($user->getUsername()); } /** * Erases the user credentials. */ public function eraseCredentials() { } /** * Add user_roles * * @param \Asap\TimesheetsBundle\Entity\Role $userRoles * @return User */ public function addUserRole(\Asap\TimesheetsBundle\Entity\Role $userRoles) { $this->user_roles[] = $userRoles; return $this; } /** * Remove user_roles * * @param \Asap\TimesheetsBundle\Entity\Role $userRoles */ public function removeUserRole(\Asap\TimesheetsBundle\Entity\Role $userRoles) { $this->user_roles->removeElement($userRoles); } }
@ponceelrelajado
Afortunadamente el error que se te está produciendo es muy fácil de solucionar. La aplicación está intentando ejecutar esta sentencia SQL para insertar nueva información:
INSERT INTO user_role (user_id, role_id) VALUES (0, 2);
El problema es que en la tabla relacionada (admin_user
) no existe un usuario con el id = 0
y por eso no se puede insertar la información. Ya se que parece que usar calves foráneas es un incordio, pero precisamente su ventaja es que no te deja insertar información errónea, como por ejemplo roles asignados a un usuario que no existe.
La solución más sencilla sería insertar primero el usuario y después sus roles. Otra posible solución sería buscar el id
correcto del usuario que ya está insertado y para el que quieres asignar roles.
Al margen de este error, te quería comentar que me parece que tu código es demasiado complicado. Symfony ya se puede encargar de gestionar los roles, por lo que no hace falta que crees otra tabla para ello.
@javiereguiluz
Hola @javiereguiluz gracias por tu pronta respuesta, en efecto estoy usando Symfony para los roles. Yo no cree esa tabla (user_rol
). Entiendo el error de la clave foranea.
Mi yugo es que usando Symfony al hacer el persist()
y flush()
de todo el objeto usuario, no está guardando el usuario sin generarme error alguno. Al no guardar el usuario nuevo, no puede guardar la relacion del rol. Mi pregunta es qué tiene mal mi entidad porque no puedo hacer save
en ella, pero como dije en un principio en local sí puedo.
@ponceelrelajado
Después de revisar tu código, yo haría dos pequeños cambios en la clase User
:
- El método
equals()
lo puedes eliminar completamente, ya que no es necesario en Symfony desde hace varias versiones (creo que la 2.1). - El
@ORM\GeneratedValue(strategy="IDENTITY")
de la propiedadid
yo lo cambiaría por@ORM\GeneratedValue(strategy="AUTO")
, ya que es el único valor que garantiza una portabilidad total de un sistema a otro.
Por otra parte, dices que la información no se inserta, pero que al mismo tiempo no se genera ningún mensaje de error de Doctrine. Como esto es bastante extraño, ¿puedes mirar la sección Doctrine del profiler de Symfony para ver qué consultas se han hecho y qué resultado han tenido?
@javiereguiluz
Copio lo creo es relevante:
DEBUG - "START TRANSACTION" DEBUG - INSERT INTO admin_user (idquickbooks, nombres, apellidos, username, useremail, password, salt, is_active) VALUES (?, ?, ?, ?, ?, ?, ?, ?) Context: {"1":"0125","2":"Jhon","3":"Marquez","4":"jmarquez","5":"[email protected]", "6":null,"7":null,"8":0} DEBUG - INSERT INTO user_role (user_id, role_id) VALUES (?, ?) Context: [0,1] DEBUG - "ROLLBACK"
¡De verdad ya me estoy desesperando!
@ponceelrelajado
Para ser mas claro te copio la funcion del controlador donde hago el save:
<?php namespace Asap\TimesheetsBundle\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use Asap\TimesheetsBundle\Entity\User; use Asap\TimesheetsBundle\Form\Type\UsuariosType; class UserController extends Controller {
public function newAction(Request $request) { $usuario = new User(); $direccion = new Direccion(); $cuentabancaria = new Cuentabancaria(); $form = $this->createForm(new UsuariosType(), $usuario); $em = $this->getDoctrine()->getManager(); $telefonotipo = $em->getRepository('AsapTimesheetsBundle:Telefonotipo')->findAll(); $emailtipo = $em->getRepository('AsapTimesheetsBundle:Emailtipo')->findAll(); $direcciontipo = $em->getRepository('AsapTimesheetsBundle:Direcciontipo')->findAll(); $ubicacionpais = $em->getRepository('AsapTimesheetsBundle:Ubicacionpais')->getEstadosPermitidos(); $cuentabanacariatipo = $em->getRepository('AsapTimesheetsBundle:Cuentabancariatipo')->findAll(); $form->handleRequest($request); if ($form->isValid()) { //$this->setSecurePassword($usuario); $u = $this->getDoctrine()->getManager(); $u->persist($usuario); $u->flush(); return $this->redirect($this->generateUrl('admin_user_show', array('id' => $usuario->getId()))); } return $this->render('AsapTimesheetsBundle:User:new.html.php', array('form' => $form->createView(),'telefonotipo' => $telefonotipo,'emailtipo' => $emailtipo,'direcciontipo' => $direcciontipo,'ubicacionpais' => $ubicacionpais,'cuentabanacariatipo' => $cuentabanacariatipo,'em' => $em)); } }
El formulario que estoy usando:
<?php namespace Asap\TimesheetsBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class UsuariosType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('idquickbooks', 'text', array('attr' => array('class'=>'form-control validate[required]', 'placeholder'=>"Enter the user's previously generated QuickBooks ID. Example: 12345-01"))) ->add('nombres', 'text', array('attr' => array('class'=>'form-control validate[required,custom[onlyLetterSp]]', 'placeholder'=>'Enter the user Name. Example: John'))) ->add('apellidos', 'text', array('attr' => array('class'=>'form-control validate[required,custom[onlyLetterSp]]', 'placeholder'=>'Enter the user Surname. Example: Downland'))) ->add('username', 'text', array('attr' => array('class'=>'form-control validate[required]', 'placeholder'=>'Select a username for this user. Example: jdownland'))) ->add('useremail', 'text', array('attr' => array('class'=>'form-control validate[required,custom[email]]', 'placeholder'=>'Enter the main Email for this user. Example: [email protected]'))) //->add('salt', 'hidden', array('attr' => array('class'=>'form-control', 'placeholder'=>'Enter the user Name. Example: John'))) //->add('password', 'password', array('attr' => array('class'=>'form-control validate[required]', 'placeholder'=>'Enter Password'))) ->add('isActive', 'choice', array('choices' => array('1' => 'Yes', '0' => 'No'),'preferred_choices' => array('Yes'), 'attr' => array('class'=>'form-control'))) //->add('user_roles', 'entity', array('class' => 'AsapTimesheetsBundle:Role','property' => 'name','attr' => array('class'=>'form-control validate[required]'),'empty_value' => 'Choose Role','empty_data' => null)) ->add('user_roles', 'entity', array('class' => 'AsapTimesheetsBundle:Role','property' => 'name','attr' => array('class'=>'form-control validate[required]'),'multiple' => 'false')) ->add('save', 'submit', array('attr' => array('class'=>'btn btn-generic'))); } public function setDefaultOptions ( OptionsResolverInterface $resolver ) { $resolver -> setDefaults ( array ( 'data_class' => 'Asap\TimesheetsBundle\Entity\User' )); } public function getName() { return 'usuarios'; } }
La entidad Role
:
<?php // proyecto/src/Asap/TimesheetsBundle/Entity/Role.php namespace Asap\TimesheetsBundle\Entity; use Symfony\Component\Security\Core\Role\RoleInterface; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="admin_roles") */ class Role implements RoleInterface { /** * @var integer * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @var string * * @ORM\Column(name="nombre", type="string", length=255, nullable=true) */ protected $name; /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set name * * @param string $name */ public function setName($name) { $this->name = $name; } /** * Get name * * @return string */ public function getName() { return $this->name; } public function getRole() { return $this->getName(); } public function __toString() { return $this->getRole(); } }
y nuevamente la entidad User
:
<?php // proyecto/src/Asap/TimesheetsBundle/Entity/User.php namespace Asap\TimesheetsBundle\Entity; use Symfony\Component\Security\Core\User\UserInterface; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass="Asap\TimesheetsBundle\Entity\UserRepository") * @ORM\Table(name="admin_user") */ class User implements UserInterface { /** * @var integer * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORM\Column(name="idquickbooks", type="string", length=255, nullable=true) */ private $idquickbooks; /** * @var string * * @ORM\Column(name="nombres", type="string", length=255, nullable=false) */ private $nombres; /** * @var string * * @ORM\Column(name="apellidos", type="string", length=255, nullable=false) */ private $apellidos; /** * @var string * * @ORM\Column(name="username", type="string", length=255, nullable=true) */ protected $username; /** * @var string * * @ORM\Column(name="useremail", type="string", length=255, nullable=false) */ private $useremail; /** * @var string * * @ORM\Column(name="password", type="string", length=255, nullable=true) */ protected $password; /** * @var string * * @ORM\Column(name="salt", type="string", length=255, nullable=true) */ protected $salt; /** * @ORM\Column(name="is_active", type="boolean") */ private $isActive; /** * @ORM\OneToMany(targetEntity="Cuentabancaria", mappedBy="usuarioid") */ protected $cuentabancaria_usuario_id; /** * @ORM\OneToMany(targetEntity="Direccion", mappedBy="usuarioid") */ protected $direccion_usuario_id; /** * @ORM\OneToMany(targetEntity="Emails", mappedBy="usuarioid") */ protected $email_usuario_id; /** * @ORM\OneToMany(targetEntity="Empresa", mappedBy="empresausuarioadministradorid") */ protected $empresa_usuario_administrador_id; /** * @ORM\OneToMany(targetEntity="Empresa", mappedBy="empresausuariofacturacionid") */ protected $empresa_usuario_facturacion_id; /** * @ORM\OneToMany(targetEntity="Telefono", mappedBy="usuarioid") */ protected $telefono_usuario_id; /** * @ORM\OneToMany(targetEntity="Timesheet", mappedBy="timesheetusuarioid") */ protected $timesheet_usuario_id; /** * @ORM\OneToMany(targetEntity="LogTimesheets", mappedBy="usuario_creador") */ protected $timesheet_log_usuario_creador; /** * @ORM\OneToMany(targetEntity="LogTimesheets", mappedBy="usuario_modificador") */ protected $timesheet_log_usuario_modificador; /** * @ORM\OneToMany(targetEntity="LogUsers", mappedBy="usuarioid") */ protected $log_usuario_id; /** * @ORM\OneToMany(targetEntity="LogUsers", mappedBy="usuario_modificador_id") */ protected $log_usuario_modificador; /** * @ORM\OneToMany(targetEntity="Usuariorogrupo", mappedBy="usuarioid") */ protected $usuariogrupo_usuario_id; /** * se utilizó user_roles para no hacer conflicto al aplicar ->toArray en getRoles() * @ORM\ManyToMany(targetEntity="Role") * @ORM\JoinTable(name="user_role", * joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")} * ) */ protected $user_roles; public function __construct() { $this->user_roles = new ArrayCollection(); $this->cuentabancaria_usuario_id = new ArrayCollection(); $this->direccion_usuario_id = new ArrayCollection(); $this->email_usuario_id = new ArrayCollection(); $this->empresa_usuario_administrador_id = new ArrayCollection(); $this->empresa_usuario_facturacion_id = new ArrayCollection(); $this->telefono_usuario_id = new ArrayCollection(); $this->timesheet_usuario_id = new ArrayCollection(); $this->timesheet_log_usuario_creador = new ArrayCollection(); $this->timesheet_log_usuario_modificador = new ArrayCollection(); $this->log_usuario_id = new ArrayCollection(); $this->log_usuario_modificador = new ArrayCollection(); $this->usuariogrupo_usuario_id = new ArrayCollection(); $this->isActive = false; } /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set idquickbooks * * @param string $idquickbooks * @return Usuario */ public function setIdquickbooks($idquickbooks) { $this->idquickbooks = $idquickbooks; return $this; } /** * Get nombres * * @return string */ public function getIdquickbooks() { return $this->idquickbooks; } /** * Set nombres * * @param string $nombres * @return Usuario */ public function setNombres($nombres) { $this->nombres = $nombres; return $this; } /** * Get nombres * * @return string */ public function getNombres() { return $this->nombres; } /** * Set apellidos * * @param string $apellidos * @return Usuario */ public function setApellidos($apellidos) { $this->apellidos = $apellidos; return $this; } /** * Get apellidos * * @return string */ public function getApellidos() { return $this->apellidos; } /** * Set username * * @param string $username */ public function setUsername($username) { $this->username = $username; } /** * Get username * * @return string */ public function getUsername() { return $this->username; } /** * Set user_email * * @param string $userEmail * @return Usuario */ public function setUseremail($useremail) { $this->useremail = $useremail; return $this; } /** * Get user_email * * @return string */ public function getUseremail() { return $this->useremail; } /** * Set password * * @param string $password */ public function setPassword($password) { $this->password = $password; } /** * Get password * * @return string */ public function getPassword() { return $this->password; } /** * Set salt * * @param string $salt */ public function setSalt($salt) { $this->salt = $salt; } /** * Get salt * * @return string */ public function getSalt() { return $this->salt; } /** * Add cuentabancaria_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Cuentabancaria $cuentabancariaUsuarioId * @return Usuario */ public function addCuentabancariaUsuarioId(\Asap\TimesheetsBundle\Entity\Cuentabancaria $cuentabancariaUsuarioId) { $this->cuentabancaria_usuario_id[] = $cuentabancariaUsuarioId; return $this; } /** * Remove cuentabancaria_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Cuentabancaria $cuentabancariaUsuarioId */ public function removeCuentabancariaUsuarioId(\Asap\TimesheetsBundle\Entity\Cuentabancaria $cuentabancariaUsuarioId) { $this->cuentabancaria_usuario_id->removeElement($cuentabancariaUsuarioId); } /** * Get cuentabancaria_usuario_id * * @return \Doctrine\Common\Collections\Collection */ public function getCuentabancariaUsuarioId() { return $this->cuentabancaria_usuario_id; } /** * Add direccion_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Direccion $direccionUsuarioId * @return Usuario */ public function addDireccionUsuarioId(\Asap\TimesheetsBundle\Entity\Direccion $direccionUsuarioId) { $this->direccion_usuario_id[] = $direccionUsuarioId; return $this; } /** * Remove direccion_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Direccion $direccionUsuarioId */ public function removeDireccionUsuarioId(\Asap\TimesheetsBundle\Entity\Direccion $direccionUsuarioId) { $this->direccion_usuario_id->removeElement($direccionUsuarioId); } /** * Get direccion_usuario_id * * @return \Doctrine\Common\Collections\Collection */ public function getDireccionUsuarioId() { return $this->direccion_usuario_id; } /** * Add email_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Emails $emailUsuarioId * @return Usuario */ public function addEmailUsuarioId(\Asap\TimesheetsBundle\Entity\Emails $emailUsuarioId) { $this->email_usuario_id[] = $emailUsuarioId; return $this; } /** * Remove email_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Emails $emailUsuarioId */ public function removeEmailUsuarioId(\Asap\TimesheetsBundle\Entity\Emails $emailUsuarioId) { $this->email_usuario_id->removeElement($emailUsuarioId); } /** * Get email_usuario_id * * @return \Doctrine\Common\Collections\Collection */ public function getEmailUsuarioId() { return $this->email_usuario_id; } /** * Add empresa_usuario_administrador_id * * @param \Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioAdministradorId * @return Usuario */ public function addEmpresaUsuarioAdministradorId(\Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioAdministradorId) { $this->empresa_usuario_administrador_id[] = $empresaUsuarioAdministradorId; return $this; } /** * Remove empresa_usuario_administrador_id * * @param \Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioAdministradorId */ public function removeEmpresaUsuarioAdministradorId(\Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioAdministradorId) { $this->empresa_usuario_administrador_id->removeElement($empresaUsuarioAdministradorId); } /** * Get empresa_usuario_administrador_id * * @return \Doctrine\Common\Collections\Collection */ public function getEmpresaUsuarioAdministradorId() { return $this->empresa_usuario_administrador_id; } /** * Add empresa_usuario_facturacion_id * * @param \Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioFacturacionId * @return Usuario */ public function addEmpresaUsuarioFacturacionId(\Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioFacturacionId) { $this->empresa_usuario_facturacion_id[] = $empresaUsuarioFacturacionId; return $this; } /** * Remove empresa_usuario_facturacion_id * * @param \Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioFacturacionId */ public function removeEmpresaUsuarioFacturacionId(\Asap\TimesheetsBundle\Entity\Empresa $empresaUsuarioFacturacionId) { $this->empresa_usuario_facturacion_id->removeElement($empresaUsuarioFacturacionId); } /** * Get empresa_usuario_facturacion_id * * @return \Doctrine\Common\Collections\Collection */ public function getEmpresaUsuarioFacturacionId() { return $this->empresa_usuario_facturacion_id; } /** * Add telefono_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Telefono $telefonoUsuarioId * @return Usuario */ public function addTelefonoUsuarioId(\Asap\TimesheetsBundle\Entity\Telefono $telefonoUsuarioId) { $this->telefono_usuario_id[] = $telefonoUsuarioId; return $this; } /** * Remove telefono_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Telefono $telefonoUsuarioId */ public function removeTelefonoUsuarioId(\Asap\TimesheetsBundle\Entity\Telefono $telefonoUsuarioId) { $this->telefono_usuario_id->removeElement($telefonoUsuarioId); } /** * Get telefono_usuario_id * * @return \Doctrine\Common\Collections\Collection */ public function getTelefonoUsuarioId() { return $this->telefono_usuario_id; } /** * Add timesheet_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Timesheet $timesheetUsuarioId * @return Usuario */ public function addTimesheetUsuarioId(\Asap\TimesheetsBundle\Entity\Timesheet $timesheetUsuarioId) { $this->timesheet_usuario_id[] = $timesheetUsuarioId; return $this; } /** * Remove timesheet_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Timesheet $timesheetUsuarioId */ public function removeTimesheetUsuarioId(\Asap\TimesheetsBundle\Entity\Timesheet $timesheetUsuarioId) { $this->timesheet_usuario_id->removeElement($timesheetUsuarioId); } /** * Get timesheet_usuario_id * * @return \Doctrine\Common\Collections\Collection */ public function getTimesheetUsuarioId() { return $this->timesheet_usuario_id; } /** * Add usuariogrupo_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Usuariorogrupo $usuariogrupoUsuarioId * @return Usuario */ public function addUsuariogrupoUsuarioId(\Asap\TimesheetsBundle\Entity\Usuariorogrupo $usuariogrupoUsuarioId) { $this->usuariogrupo_usuario_id[] = $usuariogrupoUsuarioId; return $this; } /** * Remove usuariogrupo_usuario_id * * @param \Asap\TimesheetsBundle\Entity\Usuariorogrupo $usuariogrupoUsuarioId */ public function removeUsuariogrupoUsuarioId(\Asap\TimesheetsBundle\Entity\Usuariorogrupo $usuariogrupoUsuarioId) { $this->usuariogrupo_usuario_id->removeElement($usuariogrupoUsuarioId); } /** * Get usuariogrupo_usuario_id * * @return \Doctrine\Common\Collections\Collection */ public function getUsuariogrupoUsuarioId() { return $this->usuariogrupo_usuario_id; } /** * Add user_roles * * @param Asap\TimesheetsBundle\Entity\Role $userRoles */ public function addRole(\Asap\TimesheetsBundle\Entity\Role $userRoles) { $this->user_roles[] = $userRoles; } public function setUserRoles($roles) { $this->user_roles = $roles; } /** * Set isActive * * @param boolean $isActive * @return Usuario */ public function setIsActive($isActive) { $this->isActive = $isActive; return $this; } /** * Get isActive * * @return boolean */ public function getIsActive() { return $this->isActive; } /** * Add timesheet_log_usuario_creador * * @param \Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioCreador * @return Usuario */ public function addTimesheetLogUsuarioCreador(\Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioCreador) { $this->timesheet_log_usuario_creador[] = $timesheetLogUsuarioCreador; return $this; } /** * Remove timesheet_log_usuario_creador * * @param \Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioCreador */ public function removeTimesheetLogUsuarioCreador(\Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioCreador) { $this->timesheet_log_usuario_creador->removeElement($timesheetLogUsuarioCreador); } /** * Get timesheet_log_usuario_creador * * @return \Doctrine\Common\Collections\Collection */ public function getTimesheetLogUsuarioCreador() { return $this->timesheet_log_usuario_creador; } /** * Add timesheet_log_usuario_modificador * * @param \Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioModificador * @return Usuario */ public function addTimesheetLogUsuarioModificador(\Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioModificador) { $this->timesheet_log_usuario_modificador[] = $timesheetLogUsuarioModificador; return $this; } /** * Remove timesheet_log_usuario_modificador * * @param \Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioModificador */ public function removeTimesheetLogUsuarioModificador(\Asap\TimesheetsBundle\Entity\LogTimesheets $timesheetLogUsuarioModificador) { $this->timesheet_log_usuario_modificador->removeElement($timesheetLogUsuarioModificador); } /** * Get timesheet_log_usuario_modificador * * @return \Doctrine\Common\Collections\Collection */ public function getTimesheetLogUsuarioModificador() { return $this->timesheet_log_usuario_modificador; } /** * Add log_usuario_id * * @param \Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioId * @return Usuario */ public function addLogUsuarioId(\Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioId) { $this->log_usuario_id[] = $logUsuarioId; return $this; } /** * Remove log_usuario_id * * @param \Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioId */ public function removeLogUsuarioId(\Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioId) { $this->log_usuario_id->removeElement($logUsuarioId); } /** * Get log_usuario_id * * @return \Doctrine\Common\Collections\Collection */ public function getLogUsuarioId() { return $this->log_usuario_id; } /** * Add log_usuario_modificador * * @param \Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioModificador * @return Usuario */ public function addLogUsuarioModificador(\Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioModificador) { $this->log_usuario_modificador[] = $logUsuarioModificador; return $this; } /** * Remove log_usuario_modificador * * @param \Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioModificador */ public function removeLogUsuarioModificador(\Asap\TimesheetsBundle\Entity\LogUsers $logUsuarioModificador) { $this->log_usuario_modificador->removeElement($logUsuarioModificador); } /** * Get log_usuario_modificador * * @return \Doctrine\Common\Collections\Collection */ public function getLogUsuarioModificador() { return $this->log_usuario_modificador; } /** * Get user_roles * * @return Doctrine\Common\Collections\Collection */ public function getUserRoles() { return $this->user_roles; } /** * Get roles * * @return Doctrine\Common\Collections\Collection */ public function getRoles() { //return $this->user_roles->toArray(); //IMPORTANTE: el mecanismo de seguridad de Sf2 requiere ésto como un array $roles = array(); foreach ($this->user_roles as $role) { $roles[] = $role->getRole(); } return $roles; } /** * Erases the user credentials. */ public function eraseCredentials() { } /** * Add user_roles * * @param \Asap\TimesheetsBundle\Entity\Role $userRoles * @return User */ public function addUserRole(\Asap\TimesheetsBundle\Entity\Role $userRoles) { $this->user_roles[] = $userRoles; return $this; } /** * Remove user_roles * * @param \Asap\TimesheetsBundle\Entity\Role $userRoles */ public function removeUserRole(\Asap\TimesheetsBundle\Entity\Role $userRoles) { $this->user_roles->removeElement($userRoles); } }
Agradecido de antemano por cada respuesta
@ponceelrelajado
Hola Buenas, pude solucionar, por alguna extraña razón supongo que la versión de MySQL del servidor remoto no estaba aceptando los valores boleanos. Así que sólo cambio el tipo de campo en mi entity, actualicé el schema y todo funciona a la perfección. Explico mi solución por si a alguna persona le da el mismo error.
Saludos y gracias!
@ponceelrelajado
@ponceelrelajado, ¡muchas gracias por mostrarnos la solución! Parece que al final era algo "fácil" de solucionar porque no estaba realmente relacionado con el código de la aplicación.
Por problemas como este provocados por las diferencias entre el sistema de desarrollo y el de producción es por lo que algunos programadores recomiendan unificar entornos. Para ello hacen uso de soluciones basadas en máquinas virtuales, como Vagrant, y así consiguen tener en local el mismo sistema que en producción.
@javiereguiluz