2012-03-20 68 views
10

我想創建一個使用原則的加權搜索。這是我如何在直接SQL中做到這一點。我想知道如何將它轉換爲我們的doctrine2方法。我正在嘗試使用symfony2進行搜索。如何將一個複雜的MySQL查詢轉換爲Doctrine2

此外,如果有更好的方式來做到這一點,我願意這樣做。謝謝。

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

回答

17

是的,它可以使用DQL完成。學說不支持IF聲明。但通過CASE聲明可以實現相同的功能。樣品DQL給出波紋管,

$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

謝謝你,工作幾乎完美,我需要知道如何做的唯一的事情就是它做的通配符%的LIKE搜索。我試過%:searchterm%,但它不是那樣的。 – chasen 2012-03-21 16:00:27

+0

沒關係,我明白了。只需改變 - > setParameter('searchterm',$ searchterm)to - > setParameter('searchterm','%'。$ searchterm。'%') – chasen 2012-03-21 16:24:28

+0

'CASE'語法也適用於Doctrine2查詢構建器。非常感謝。 – 2014-09-30 12:22:43