Symfony2查询数组匹配

时间:2014-02-11 10:45:35

标签: arrays symfony doctrine-orm matching dql

我正在尝试使用Symfony2中的数组进行查询,但我遇到了一些问题。

我有两个带有一个数组字段的实体(我将它用作Tag字段)。我的意图是,当我有Entity1的对象时,我会查询数据库以选择至少有一个公共标记的实体对象。任何人都知道我该怎么做?

我还想知道是否可以将尽可能多的匹配结果排序为低(即,那些共同拥有更多标签的人,首先出现)。

实体结构示例:

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

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

非常感谢你们!

更新

现在,我有一个带有ManyToMany的Entity1和Entity2到一个名为Tags的实体。现在,这个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

现在,我无法将这两个表组合在一个简单的JOIN和DQL中,因为在DQL中我们不能使用Doctrine自动表(entity1_tags和entity2_tags)。

任何人都知道如何将SQL代码转换为DQL?

2 个答案:

答案 0 :(得分:1)

Doctrine ORM array类型作为序列化数据保存在数据库中。由于它只是一个字符串,因此您无法按照自己的意愿进行此类查询。您有两种可能的方法来解决它:

  1. 为具有ManyToMany或ManyToOne关系的标签使用单独的表
  2. 使用doctrine simple_array类型保存标签,然后使用全文搜索查询它们。全文不适用于所有RDBMS,因此您可能需要一些搜索服务器,如sphinx或类似的。

答案 1 :(得分: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);