2012-03-20 69 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