2014-02-11 132 views
1

我想用Symfony2中的數組進行查詢,我遇到了一些問題。Symfony2查詢數組匹配

我有兩個實體與一個數組字段(我用它作爲標記字段)。我的意圖是,當我有Entity1的對象時,我會查詢數據庫以選擇至少具有一個公共標記的實體對象。任何人都知道我該怎麼做?

我還想知道是否有可能將盡可能多的匹配結果排序爲低(即那些有更多標籤共同出現的人)。實體結構的

例子:

Entity1: 
    - id = 1 
    - tags = {'Football', 'Soccer', 'Premier Leage'} 

Entity2: 
    - id = 2 
    - tags = {'Football', 'Hockey', 'Tennis'} 

非常感謝你們!

UPDATE:

現在,我有一個ENTITY1和ENTITY2與多對多的實體,稱爲標籤。現在,這個SQL得到我正確的ENTITY2 ID:

SELECT e2.entity2_id, COUNT(e2.entity2_id) AS common_tag_count 
FROM entity2_tags AS e2 
INNER JOIN entity1_tags AS e1 ON e2.tags_id = e1.tags_id 
WHERE e1.entity1_id =3 
GROUP BY e2.entity2_id 
HAVING e2.entity2_id !=2 
ORDER BY COUNT(e2.tags_id) DESC 

現在,我不能合併兩個表中的簡單與DQL JOIN,因爲DQL我們不能使用自動學說表(entity1_tags和entity2_tags)。

任何人都知道如何將SQL代碼轉換爲DQL?

回答

1

Doctrine ORMarray類型以串行化數據的形式保存在數據庫中。由於它只是一個字符串,因此無法進行您想要的查詢。你有兩種可能的方法來解決這個問題:

  1. 使用與多對多或多對一的關係
  2. 使用原則simple_array類型的標籤單獨的表標籤,然後使用全文搜索查詢它們。全文不適用於所有RDBMS,因此您可能需要一些搜索服務器,如sphinx或類似的。
+0

我已經想過使用單獨的表的可能性,而且我也有同樣的問題。你能解釋一下使用單獨表的過程嗎? – Mateu

1

即時通訊使用:

$qb = $filterQuery->getQueryBuilder(); 
$orX = $filterQuery->getExpr()->orX(); // or andX 

foreach ($values['value'] as $value) { 
    $column = $filterQuery->getExpr()->concat($filterQuery->getExpr()->literal(','), $filterQuery->getExpr()->concat($field, $filterQuery->getExpr()->literal(','))); 
    $orX->add($filterQuery->getExpr()->like($column, $filterQuery->getExpr()->literal("%,{$value},%"))); 
} 

$qb->andWhere($orX);