No es una buena señal cuando el tipo de una instancia de un objeto necesita cambiar con el tiempo. No estoy hablando de downcasting/upcasting aquí, sino de la necesidad de cambiar el tipo real de un objeto.
En primer lugar, déjenme decirles por qué es una mala idea:
- Una subclase puede definir más atributos y hacer algún trabajo additionnal en ella del constructor. ¿Deberíamos ejecutar el nuevo constructor nuevamente? ¿Qué si sobrescribe algunos de los atributos de nuestro objeto anterior?
- ¿Qué pasaría si estuvieras trabajando en una instancia de esa Persona en alguna parte de tu código, y luego se transformara repentinamente en un Empleado (que podría tener un comportamiento redefinido que no esperarías)?
Esa es la razón por la cual la mayoría de los idiomas no le permitirán cambiar el tipo de clase real de un objeto durante la ejecución (y memoria, por supuesto, pero no quiero entrar en detalles). Algunos te permiten hacer eso (a veces de maneras retorcidas, por ejemplo, la JVM), ¡pero en realidad no es una buena práctica!
La mayoría de las veces, la necesidad de hacerlo radica en malas decisiones de diseño orientadas a objetos.
Por esas razones, Doctrine no le permitirá cambiar el tipo de objeto de su entidad. Por supuesto, puede escribir SQL simple (al final de esta publicación, pero por favor ¡lea todo!) Para hacer el cambio de todos modos, pero aquí hay dos opciones "limpias" que sugeriría:
Me doy cuenta de que tiene Ya dije que la primera opción no era una opción, pero pasé un tiempo escribiendo esta publicación, así que siento que debería hacerlo lo más completo posible para futuras referencias.
- Siempre que necesite "cambiar el tipo" de
Person
a Employee
, crear una nueva instancia de la empleado y copiar los datos que desea copiar el relevo de la persona objeto antiguo al objeto Employee. No se olvide de eliminar la entidad anterior y persistir la nueva.
- Use la composición en lugar de la herencia (consulte este wiki article para obtener detalles y enlaces a otros artículos). EDITAR: Por el placer de hacerlo, here's a part of a nice conversation with Erich Gamma sobre "Composición sobre herencia"!
Consulte las discusiones relacionadas here y here.
Ahora, aquí es el método normal de SQL que estaba hablando antes - espero que no tendrá que usarlo!
Asegúrate de que tu consulta esté desinfectada (ya que la consulta se ejecutará sin ninguna verificación).
$query = "UPDATE TABLE_NAME_HERE SET discr = 'employee' WHERE id = ".$entity->getId();
$entity_manager->getConnection()->exec($query);
Aquí es la documentación y el código para el método exec que está en la clase DBAL\Connection
(para su información):
/**
* Execute an SQL statement and return the number of affected rows.
*
* @param string $statement
* @return integer The number of affected rows.
*/
public function exec($statement)
{
$this->connect();
return $this->_conn->exec($statement);
}
Muchas gracias. Estar tranquilo; Tomaré su consejo y evitaré el SQL simple. – Nate
Tropecé con esto dos veces y realmente me ayudó. ¡Gracias! – Strategist