Как конвертировать сложный MySQL Query в Doctrine2 - PullRequest
10 голосов
/ 20 марта 2012

Я пытаюсь создать взвешенный поиск, используя доктрину.Вот как я делаю это в прямой SQL.Мне интересно, как я мог бы преобразовать это к нам методами doctrine2.Я пытаюсь сделать этот поиск, используя 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"

1 Ответ

17 голосов
/ 21 марта 2012

Да, это можно сделать с помощью 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)
  ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...