Como cambiar la tabla asociada en Doctrine en RUNTIME?

75 views
Skip to first unread message

Sebastian Riquelme

unread,
Aug 25, 2015, 2:04:56 PM8/25/15
to Symfony Madrid
Estimados, una consulta.

Resulta que debo crear una aplicación de consulta, que va a buscar los datos a una base de datos ya existente y administrada por otro software. Quiero crear las entidades y hacer las consultas basadas en Doctrine, con la misma relación que tienen las tablas originales.

El problema recae en que en la base de datos existe una tabla por cada mes para una misma entidad. Por ejemplo tengo la entidad "LIBRO DE COMPRAS" y la base de datos tiene una tabla de Libro de compra pero por cada mes, es decir: LC012014, LC022014, ... LC122014. Lo mismo para el Libro de Ventas: LV012014, LV022014... LV122014.

Cabe mencionar que todas las tablas de la misma entidad tienen la misma estructura, solo cambia el mes y año en el nombre.

En mi aplicación solamente quiero crear UNA entidad Libro de Compra y UNA entidad Libro de Venta, para poder ir a buscar los datos, pero no sé como hacerlo para que en tiempo de ejecución poder decirle a Doctrine qué tabla es la que tiene que consultar según el mes solicitado.

De no poder hacerlo, tendré que generar las consultas a mano y no podré ocupar Doctrine, y no quiero llegar a eso.

No sé si fui bastante claro. De antemano muchas gracias.

PD: Adjunto una imagen de las tablas para que me entiendan: (LR -> LIBRO REMUNERACIONES)


Roberto Bermejo Martínez

unread,
Aug 25, 2015, 2:13:04 PM8/25/15
to symfony...@googlegroups.com
Hola
    Yo intentaría resolverlo mediante vistas.
    Aunque desconozco si puedes hacerlo de este modo. Otra forma es usar los eventos que tiene doctrine antes y después del mareo, como se hace para añadir las funcionalidad es extra de las extensiones.


Saludos

Enviado desde mi iPhone
--
Has recibido este mensaje porque estás suscrito al grupo "Symfony Madrid" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a symfony_madri...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

daniel....@freelancemadrid.es

unread,
Aug 25, 2015, 2:50:23 PM8/25/15
to symfony...@googlegroups.com

$libro = $repository-> findOneBy( [ 'name' => $name ]);

sent from nexus 5

daniel....@freelancemadrid.es

unread,
Aug 25, 2015, 2:53:38 PM8/25/15
to symfony...@googlegroups.com

A no espera no había entendido bien el problema. Yo creó que no necesitas varias tablas, y puedes poner el nombre del libro como campo de la tabla.

Si son iguales creó que es la forma correcta.

Tabla libros donde contienes la información de cada libro y tabla entradas con las entradas y una referencia al libro al que pertenecen.

Si algún requerimiento te impide hacer esto, yo creó que con los eventos de doctrine puedes hacerlo.

sent from nexus 5

Sebastian Riquelme

unread,
Aug 25, 2015, 2:59:36 PM8/25/15
to Symfony Madrid
Muchas gracias, 

No puedo cambiar la estructura de la base, porque solo tengo permiso de lectura. Probaré con los eventos de Doctrine haber si puedo hacer algo por ahi. 

Les comento si lo soluciono, muchas gracias por su ayuda

Antonio J. García Lagar

unread,
Aug 26, 2015, 2:34:14 AM8/26/15
to symfony...@googlegroups.com
Hola Sebastián:

Yo en tu caso, si la aplicación es solo de consultas para hacer reportes, no utilizaría Doctrine ORM. Añadirá complejidad si aportar muchas ventajas.

El propio @ocramius en su presentación "Doctrine 2 ORM Best Practices" [vídeo] desaconseja este tipo de uso para el ORM y recomienda utilizar directamente SQL (yo usaría Doctrine DBAL).

Suerte con ello.

--
Has recibido este mensaje porque estás suscrito al grupo "Symfony Madrid" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a symfony_madri...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Sebastian Riquelme

unread,
Aug 26, 2015, 10:01:21 AM8/26/15
to symfony...@googlegroups.com
Muchas gracias. Efectivamente vi las mejores practicas y me aclaró varias cosas... ahora veré el uso de DBAL para ver si por ahí soluciono mi tema.

Gracias por aportar a mi acotado conocimiento.

Les comentaré la manera que lo haré cuando solucione el problema.

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "Symfony Madrid" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/symfony_madrid/OwfqNhmZo0M/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a symfony_madri...@googlegroups.com.

Sebastian Riquelme

unread,
Oct 6, 2015, 5:20:46 PM10/6/15
to symfony...@googlegroups.com
Estimados, 

Yo por acá nuevamente. Gracias a la sugerencia de Antonio, estoy trabajando con Doctrine DBAL, pero arrojó la siguiente consulta:

Tengo que acceder al servicio de DBAL (database_connecion) dentro de una entidad para poder crearla?

Tengo que pasarlo por obligación por el constructor para devolver el objeto?

Por ejemplo:

namespace AppBundle\Entity;

class Funcionario
{
    
private $conn;

    
public function __construct($idFuncionario)
    
{
        
// Aqui debo acceder al contenedor de servicio para crear la conexion $conn
        $this
->conn = $conn
        $stmt 
= $conn->query("SELECT...");
        //... crear el objeto funcionario
    
}

Asi desde un controlador poder crear el objeto de la siguiente forma:

$id = 1;

$funcionario 
= new Funcionario($id);


Que me recomiendan? estoy obligado a pasar la conexión por el constructor?

De antemano muchas gracias.

Saludos.
Sebastian Riquelme

daniel....@freelancemadrid.es

unread,
Oct 7, 2015, 4:57:25 AM10/7/15
to symfony...@googlegroups.com
Hola Sebastian el código que muestras tiene muy mala pinta :(


2015-10-06 23:20 GMT+02:00 Sebastian Riquelme <sebastian.el...@gmail.com>:
namespace AppBundle\Entity;

class Funcionario
{
    
private $conn;

    
public function __construct($idFuncionario)
    
{
        
// Aqui debo acceder al contenedor de servicio para crear la conexion $conn
        $this
->conn = $conn
        $stmt 
= $conn->query("SELECT...");
        //... crear el objeto funcionario
    
}

Asi desde un controlador poder crear el objeto de la siguiente forma:

No es responsabilidad del Funcionario construirse a sí mismo, si no de un Manager o en su defecto un repositorio. Revisa el patrón de diseño de Doctrine2 Data Mapper[1]

Tampoco sé para que necesitas asignarle la id, de eso se encarga el ORM.
 

$id = 1;

$funcionario 
= new Funcionario($id);


Que me recomiendan? estoy obligado a pasar la conexión por el constructor?

De antemano muchas gracias.


// en tu controlador.
$manager = $this->get('official.manager');
$official = $manager->create(); 

// whatever what you want to do

$manager->persist($official);


// tu manager
call OfficialManager(){

public function __conscruct(EntityManager $em)
 $this->em = $em
}

Atención que no estiy usando la conexion si no el enttity manager, la conexion no la necesitas.

//  en tu managers.xml
Aqui te mapeas el servicio para poder usarlo.


[1] http://designpatternsphp.readthedocs.org/en/latest/Structural/DataMapper/README.html


--
-------------------------------------------------------------------------------------
Daniel González Cerviño
Developer http://desarrolla2.com
Tel (+34) 653 96 50 48
Mail daniel....@freelancemadrid.es
Twiter: http://twitter.com/desarrolla2
Linkedin: http://www.linkedin.com/in/desarrolla2
Github: https://github.com/desarrolla2
-------------------------------------------------------------------------------------

Sebastian Riquelme

unread,
Oct 7, 2015, 9:01:16 AM10/7/15
to symfony...@googlegroups.com
Muchas gracias por tu respuesta. 

Entiendo a lo que vas. Una entidad no debe construirse a si misma, sino que tendría que crear un manejador de entidades.

El punto es que estoy trabajando con DBAL y no con ORM porque solo tengo acceso de lectura a una base de datos que no la administro ni mantengo yo, y solamente a ciertas tablas de esa base de datos.

Por ejemplo dependiendo del Id del funcionario es la tabla que tengo que consultar, si el id comienza con A tengo que ir a la tabla funcionario A o si el id comienza con B tengo que ir a la tabla funcionario B, aun siendo (para mi aplicación) la misma entidad Funcionario.

Resumiendo:

1. Tendría que crear una clase que simule un Entity Manager que me gestione las entidad y que sepa cuando llamar a la tabla A o B dependiendo del Id del Funcionario.
2. En este Manajedor de Entidades es donde debo gestionar la conexion (Doctrime\DBAL\Connection) para hacer las consultas.
3. Crear este manejador de entidades como un servicio para acceder desde cualqueir controlador

Me puedes corregir por favor si lo que expongo es correcto? te lo agradecería enormemente.

Y tengo la ultima consulta (eso espero) que es menos importarte. En qué directorio de AppBundle creo esta clase?

Muchas gracias nuevamente por tu enorme ayuda, me ha servido mucho para seguir aprendiendo en el ámbito de desarrollo de aplicaciones.

Saludos.


El 7 de octubre de 2015, 5:57, daniel....@freelancemadrid.es <daniel....@freelancemadrid.es> escribió:
Data Mapper[1]


Reply all
Reply to author
Forward
0 new messages