2012-03-20 18 views
10

私はdoctrineを使って重み付き検索を作成しようとしています。これは私がまっすぐ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を使用して行うことができます。 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) 
    ; 
+0

はそれがほぼ完璧に働いている、私が行う方法を知っておく必要がある唯一の事は、それがワイルドカードの%とLIKE検索を行うことです、ありがとうございました。私は%:searchterm%を試しましたが、それはそういうわけではありませんでした。 – chasen

+0

私はそれを得た。 – chasen

+0

'CASE'構文は、Doctrine2クエリービルダーでも動作します。また、setParameter( 'searchterm'、$ searchterm)をsetParameter( 'searchterm'、 '%'。$ searchterm。 '%')どうもありがとう。 –