【问题标题】:How to convert a complex MySQL Query to Doctrine2如何将复杂的 MySQL 查询转换为 Doctrine2
【发布时间】:2012-03-20 19:37:09
【问题描述】:

我正在尝试使用学说创建加权搜索。这就是我在直接 sql 中的做法。我想知道如何将其转换为我们的学说 2 方法。我正在尝试使用 symfony2 进行此搜索。

此外,如果有更好的方法可以做到这一点,我愿意接受。谢谢。

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

【问题讨论】:

    标签: mysql symfony doctrine-orm


    【解决方案1】:

    是的,可以使用DQL 完成。 Doctrine 不支持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)
      ;
    

    【讨论】:

    • 谢谢你,它工作得几乎完美,我唯一需要知道的就是让它使用通配符 % 进行 LIKE 搜索。我试过 %:searchterm% 但它不喜欢那样。
    • 没关系,我明白了。只需将 ->setParameter('searchterm' , $searchterm) 更改为 ->setParameter('searchterm' , '%'.$searchterm.'%')
    • CASE 语法也适用于 Doctrine2 查询生成器。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2020-12-29
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多