inner - Symfony2 QueryBuilder une ON y WITH diferencia
query builder codeigniter (2)
@florian te dio la respuesta correcta, pero déjame intentar explicarla en un ejemplo:
En sql, las uniones se hacen así:
SELECT * FROM category
LEFT JOIN product ON product.category_id = category.id
(o algo como esto)
Ahora en Doctrine, no necesita usar la cláusula ON
porque la doctrina lo sabe de las anotaciones de relaciones en sus entidades. Entonces el ejemplo anterior sería:
// CategoryRepository.php
public function getCategoriesAndJoinProducts()
{
return $this->createQueryBuilder("o")
->leftJoin("o.products", "p")->addSelect("p")
->getQuery()->getResult() ;
}
Ambos obtendrían todas las categorías y unirían los productos asociados con ellas.
Ahora viene la cláusula WITH
. Si desea unir productos con un precio superior a 50, debe hacerlo en SQL:
SELECT * FROM category
LEFT JOIN product ON product.category_id = category.id AND product.price>50
En Doctrina:
// CategoryRepository.php
public function getCategoriesAndJoinProductsWithPriceBiggerThan($price)
{
return $this->createQueryBuilder("o")
->leftJoin("o.products", "p", "WITH", "p.price>:price")
->setParameter("price", price)->addSelect("p")
->getQuery()->getResult() ;
}
Entonces, en realidad, nunca debes usar ON
si estás usando Doctrine. Si necesitas algo así, puedes estar casi seguro de que has jodido algo más.
Soy nuevo con Symfony2 y construí con éxito mi primera unión a través de QueryBuilder y Doctrine 2. Probablemente esta es una pregunta estúpida, pero tanto en línea como en los métodos de Symfony2 no pude encontrar nada para entender la diferencia entre las cláusulas de unión ". CON "y" ENCENDIDO ".
Por ejemplo, este es mi código de unión:
->leftJoin(''EcommerceProductBundle:ProductData'', ''pdata'', ''WITH'', ''prod.id = IDENTITY(pdata.product)'')
Funciona bien, pero si me puse ON
lugar de WITH
, obtendré el siguiente error:
[Error de sintaxis] línea 0, col 200: Error: Doctrine esperada / ORM / Query / Lexer :: T_WITH, get ''ON''
¿Por qué? He visto entre los objetos que hay T_ON y T_WITH como cláusulas de unión, pero ¿cuál es su diferencia de uso? ¿Cómo son sus usos?
En teoría, ON le permite dar los criterios de unión completa, mientras que CON permite agregar criterios adicionales a los predeterminados (en mi humilde opinión).
Pero lo que permite DQL es evitar dar los criterios JOIN:
Solo tienes que decir: $qb->leftJoin(''prod.pdata'', ''pdata'');
Y doctrine2 manejará la unión correctamente.
Aquí hay una pregunta relacionada con eso: ¿Puedo usar la palabra clave "ON" en DQL o necesito usar Native Query?