2012-03-05 12 views
6

Tengo un objeto de dominio Foo que tiene una relación 1: n con una barra de objeto de dominio.Extbase: Elija la carga lenta o ansiosa en tiempo de ejecución

Existen dos casos de uso principales en los que necesito que todos los foo coincidan con algún criterio. En el caso A, me importan las barras unidas a cada foo, en el caso B, no. Hay un montón de barras, por lo que simplemente cargar las barras no es bueno para el funcionamiento del caso A. Del mismo modo, si no se cargan las barras con entusiasmo se producirá una avalancha de n + 1 en el caso B. Por lo tanto, no se etiquetará la realidad como @Lazy ni etiquetarlo es la elección correcta.

Ahora, mi pregunta: ¿es posible decirle a la capa de persistencia extbase en el momento de la consulta si va a ser flojo o ansioso? Si es así, ¿cómo? Si no, ¿hay alguna otra forma en Extbase para evitar el problema n + 1 (es decir, cargar todas las barras necesarias y luego esperar que el almacenamiento en caché funcione al iterar a través de los foos)?

Mi último recurso, por supuesto, sería cargar los foos con carga lenta, cargar las barras manualmente en una segunda consulta, y luego configurar manualmente la relación.

¿Alguna sugerencia?

+0

Lo resolví rediseñando el caso B para trabajar en los foos individualmente. No es agradable, pero mejor, y lo suficientemente rápido por el momento. Todavía me gustaría cómo lograr esto. – adhominem

+0

¿Puedes responder tu propia pregunta y marcarla como resuelta? Todavía aparece en la lista de preguntas sin respuesta [typo3]. – Mateng

+0

Hm ... Realmente no creo que la pregunta haya sido respondida. Encontré una solución para este problema en particular, pero el caso general ... – adhominem

Respuesta

2

He estado jugando con Extbase y profundizando en el funcionamiento interno en los últimos meses, y el resultado es el siguiente: es 'imposible'.

Supongo que cierra esta pregunta, aunque no de la manera que me gustaría.

En realidad, aún peor: la carga ansiosa no se implementa en absoluto, se ignora la etiqueta @eager que de acuerdo con la documentación establece una carga ansiosa para una relación.

+2

Para la última parte: la carga ansiosa es la predeterminada, por lo tanto, no hay una etiqueta '@eager'. Simplemente puede cambiar este comportamiento a perezoso con la etiqueta '@ lazy'. – shredding

+1

@shredding Eso no haría posible elegir entre el comportamiento flojo o ansioso en el tiempo de ejecución, me temo. –

+1

Sí, no puedes configurarlo en tiempo de ejecución. – shredding

0

¿qué tal dejarlo flojo y convertirlo en una matriz cuando sea necesario? (foo-> bar-> toArray())

+1

¿Cuáles son los beneficios de hacer esto? – nalply

+1

Eso seguiría siendo flojo (consulta DB adicional en el tiempo de uso para obtener datos faltantes, una consulta para cada elemento) en lugar de ansioso (todos los datos necesarios se cargan desde el DB mediante la única consulta inicial) – adhominem

Cuestiones relacionadas