2012-03-20 39 views
10

Estoy intentando crear una búsqueda ponderada usando doctrine. Así es como lo hago en sql directo. Me pregunto cómo me convertiría los métodos de doctrine2. Estoy tratando de hacer esta búsqueda usando Symfony2.Cómo convertir una consulta compleja de MySQL a Doctrine2

Además, si hay una mejor manera de hacerlo, estoy abierto a eso. Gracias.

"SELECT *, 
    IF(`name` LIKE "%$searchterm%", 20, 
    IF(`name` LIKE "%$searchterm%", 10, 0)) + 
    IF(`address` LIKE "%$searchterm%", 5, 0) + 
    IF(`city` LIKE "%$searchterm%", 1, 0) 
    AS `weight` 
FROM `table_name` 
WHERE 
    (`name` LIKE "%$searchterm%" OR 
     `address` LIKE "%$searchterm%" OR 
     `city` LIKE "%$searchterm%") 
ORDER BY `weight` DESC 
LIMIT 20" 

Respuesta

17

Sí, se puede hacer uso de DQL. Doctrine no admite la declaración IF. Pero la misma funcionalidad se puede lograr mediante la declaración CASE. Muestra DQL se da abajo,

$dql = "SELECT t, 
      (CASE 
      WHEN (t.name LIKE :searchterm) THEN 10 
      ELSE 0 
      END) + 
      (CASE 
      WHEN (t.address LIKE :searchterm) THEN 5 
      ELSE 0 
      END) + 
      (CASE 
      WHEN (t.city LIKE :searchterm) THEN 1 
      ELSE 0 
      END) 
      AS weight 
     FROM YourBundleName:TableName t 
     WHERE 
      t.name LIKE :searchterm OR 
      t.address LIKE :searchterm OR 
      t.city LIKE :searchterm 
     ORDER BY weight DESC 
     "; 
$query = $entityManager->createQuery($dql) 
    ->setFirstResult(0) 
    ->setMaxResults(20) 
    ->setParameter('searchterm' , $searchterm) 
    ; 
+0

Gracias porque está trabajando casi a la perfección, la única cosa que tengo que saber cómo hacerlo es tener que hacer la búsqueda como el comodín%. Intenté%: searchterm% pero no me gustó eso. – chasen

+0

nunca lo tengo. solo tuve que cambiar -> setParameter ('searchterm', $ searchterm) a -> setParameter ('searchterm', '%'. $ searchterm. '%') – chasen

+0

La sintaxis 'CASE' también funciona con el generador de consultas Doctrine2. Muchas gracias. –

Cuestiones relacionadas