type getdoctrine español collection php mysql symfony doctrine-orm case-when

php - getdoctrine - Cómo ordenar por caso en Doctrine2(Symfony2)



symfony collection type (3)

CASE es específico del proveedor y no está respaldado de forma nativa por la doctrina.

Si el resultado es pequeño, mi recomendación es extraer todo el conjunto de resultados y luego ordenar la matriz.

Si el conjunto de resultados será demasiado grande, debe escribir una consulta nativa e hidratar la entidad. Consulte la Documentación de Doctrine sobre SQL nativo para obtener más información sobre esto. Parece aterrador, pero tiene sentido una vez que se camina a través de un ejemplo.

Como último recurso, podría pasar por alto la doctrina y utilizar SQL nativo de bajo nivel. Vea esta publicación para más detalles.

Sé que Doctrine Extensions tiene una función IfElse que puede funcionar, pero no he escuchado muchas historias de éxito.

Quiero ejecutar esta consulta usando Doctrine en Symfony 2.3. Pero parece que Doctrine no entiende la sentencia CASE. ¿Alguien puede ayudar? ¡Gracias de antemano!

SELECT max(id) id, name FROM cards WHERE name like ''%John%'' GROUP BY name ORDER BY CASE WHEN name like ''John %'' THEN 0 WHEN name like ''John%'' THEN 1 WHEN name like ''% John%'' THEN 2 ELSE 3 END, name


Este hace el trabajo por mí cuando ordeno por una tabla de relaciones o una columna local si no existe una relación:

$doctrineQuery->add(''orderBy'', ''(CASE WHEN COUNT(relation_table.uid)>0 THEN relation_table.price ELSE current_table.generic_price END) ASC'');


Si está utilizando createQueryBuilder, entonces puede usar como

$query->addSelect("(CASE WHEN name like ''John %'' THEN 0 WHEN name like ''John%'' THEN 1 WHEN name like ''% John%'' THEN 2 ELSE 3 END) AS HIDDEN ORD "); $query->orderBy(''ORD'', ''DESC'');

Tenga en cuenta que debe tener "OCULTADO".

Usted puede hacer con la consulta nativa doctrina también.