我正在尝试使用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?
答案 0 :(得分:1)
Doctrine ORM array
类型作为序列化数据保存在数据库中。由于它只是一个字符串,因此您无法按照自己的意愿进行此类查询。您有两种可能的方法来解决它:
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);