Skip to content

Conversation

@marianofilipoff
Copy link
Contributor

$oqb = $em->createQueryBuilder(); // Original QueryBuilder
$oqb->from(Person::class, 'p');
$oqb->select('p');

Ahora la instancia decorada tiene los mismos dqlParts que $oqb
$dqb = new QueryBuilderDecorator($oqb); // DecoratedQueryBuilder

Ahora se pueden combinar from
$dqb->from(Person::class, 'p');
$dqb->from(Person::class, 'p');
$dqb->from(User::class, 'p'); // Esto tira una excepción
$dqb->from(Person::class, 'c'); // Esto NO tira una excepción

Ahora se pueden combinar select
$dqb->addSelect('p, u');
$dqb->addSelect('c');

Ahora se pueden combinar conditions en los joins (toma precedencia el ON, de existir)
$dqb->join('p.user', 'u');
$dqb->join('p.user', 'u', Join::WITH, 'u.activationDate IS NOT NULL');
$dqb->leftJoin('p.user', 'u'); // Esto tira una excepción, ya que el alias está en uso para otro tipo de JOIN

Copy link
Contributor

@dpgover dpgover left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Para completar lo que hablamos, falta mejorar la performance ejecutando los merges de joins y bla al hacer el armado del query en el "getQuery" o el "getDQL"

@marianofilipoff
Copy link
Contributor Author

Comentario con respecto a la optimización (lo que hablamos por Workplace):

1- es optimización prematura, que realmente no aporta mucho, ya que, cuantos eagerLoadings vas a tener? 200? o cuantos joins únicos vas a tener?
2- hace más complejo el código, e introduce problemas al momento de resolver los joins
3- perdemos la utilidad de las funciónes getDQLParts() / getDQLPart($name), y la idea es que el decorator funcione igual que el query builder original

@dpgover
Copy link
Contributor

dpgover commented Jun 4, 2020

Agreed

@marianofilipoff
Copy link
Contributor Author

El select puede ser tan complejo como se quiera, puede tener subqueries, comparaciones, llamadas a métodos, etc... Entonces no sirve separar por coma y asumir que cada valor es un alias.

Vamos a tener que conformarnos con eliminar duplicaciones! Que para la mayoría de los casos nos va a ser útil, por ejemplo, si luego de hacer un join quiero hacer un eager loading de esa relación.

@dpgover
Copy link
Contributor

dpgover commented Jun 8, 2020

Esta perfecto Marian. Es lo que te dije anteriormente. Es imposible atacar todos los casos. Pero resolvamos los que mas se dan y mas problemas pueden generar.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants