2012-03-20 11 views
10

Próbuję utworzyć ważone wyszukiwanie przy użyciu doktryny. Tak to robię w prostym sql. Zastanawiam się, jak przekonwertować to do nas metody doktryny2. Próbuję wykonać to wyszukiwanie przy użyciu symfony2.Jak skonwertować złożone kwerendy MySQL do Doctrine2

Również, jeśli jest lepszy sposób na to, jestem otwarty na to. Dzięki.

"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" 

Odpowiedz

17

Tak, można tego dokonać za pomocą DQL. Doctrine nie obsługuje instrukcji IF. Ale tę samą funkcjonalność można osiągnąć za pomocą oświadczenia CASE. Próbka DQL podano ryk,

$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

Dziękuję, że działa prawie idealnie, jedyną rzeczą, że muszę wiedzieć, jak to zrobić jest mieć to zrobić wyszukiwanie jak z symboli wieloznacznych%. Próbowałem%: searchterm%, ale tak nie było. – chasen

+0

Nieważne, mam to. musiałem zmienić -> setParameter ("searchterm", $ searchterm) na -> setParameter ("searchterm", "%". $ searchterm. '%') – chasen

+0

Składnia 'CASE' działa również z budowniczym zapytań Doctrine2. Wielkie dzięki. –

Powiązane problemy