2011-11-09 18 views
5

En mi aplicación, tengo varias tablas simples de referencia/base de datos de búsqueda usadas para suministrar una lista de valores permitidos en una tabla relacionada.Evitar combinaciones a tablas de referencia/búsqueda en Doctrine 2

(ya saben, la tabla a 'Países' tiene una lista de países que están permitidos en el campo de la tabla de direcciones del 'país' ...)

Para mantener mi modelo de datos tan delgado como sea posible, utilice el "Bill Karwin technique" para omitir la columna 'id' en la tabla de búsqueda y solo use el valor real como clave principal. De esta forma, no necesita hacer una combinación para obtener el valor en la tabla principal porque ya está allí como la clave externa.

El problema es que Doctrine utiliza referencias de objeto para todas las asociaciones, lo que significa que las consultas aún requieren combinaciones a las tablas de búsqueda, incluso cuando la tabla principal ya tiene los valores que necesito.

Por ejemplo, esta consulta no funciona:

$qb->select(array('a.id', 'a.street', 'a.city', 'a.country')) 
    ->from('Entity\Address', 'a'); 

En su lugar, usted tiene que hacer esto:

$qb->select(array('a.id', 'a.street', 'a.city', 'c.country')) 
    ->from('Entity\Address', 'a') 
    ->join('a.country', 'c'); 

De lo contrario obtiene este error: ". PathExpression no válida Debe ser un StateFieldPathExpression "

Sume todas las combinaciones necesarias para las tablas de búsqueda, y hay un costo innecesario en mis consultas.

¿Alguien sabe una buena manera de evitar tener que realizar combinaciones a las tablas de búsqueda/referencia en Doctrine 2?

(PS - Yo preferiría evitar el uso de ENUM, ya que son not supported by Doctrine y tienen otra well-documented disadvantages.)

Respuesta

6

Sí, este tipo de mierda, pero supongo que tenían una buena razón para hacerlo de esa camino.

Puede usar la sugerencia HINT_INCLUDE_META_COLUMNS. Incluirá todos los campos en el resultado de la consulta, incluidas las claves externas que se asignan como relaciones.

$query = \Doctrine::em()->createQuery($queryString) 
    ->setParameters($params) 
    ->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, TRUE); 

Así que si tu tienes un campo city_id en la tabla Address en el PP, que también serán emitidos en el resultado de la consulta, junto con la relación de la ciudad "estándar".

+0

Esto es genial - No sabía sobre el método setHint() y planeo darle un buen uso. – cantera

+1

La sugerencia de conjunto se usa para todo tipo de cosas, no solo para incluir meta columnas. Es una forma de adjuntar un buscador de consultas que se ejecuta con cada consulta. También puedes hacer tus propios consejos, que hacen lo que quieras. No es nada bonito;) – ZolaKt

+0

Advertencia: Doctrine no incluye claves foráneas que contengan nulo. Al igual que si city_id no es obligatorio, no siempre estará presente. Solo gasta 2 horas en eso, pensando que fue un problema de caché :) –