我正在尝试使用Symfony2中的数组进行查询,但我遇到了一些问题。
我有两个实体和一个数组字段(我将其用作标签字段)。我的目的是,当我有实体 1 的对象时,我会查询数据库以选择至少有一个公共标签的实体对象。有人知道我该怎么做吗?
我还想知道是否可以将尽可能多的匹配的结果排序为低(即,那些有更多共同标签的人,首先出现)。
实体结构示例:
Entity1:
- id = 1
- tags = {'Football', 'Soccer', 'Premier Leage'}
Entity2:
- id = 2
- tags = {'Football', 'Hockey', 'Tennis'}
非常感谢大家!
更新:
现在,我有一个实体 1 和实体 2,其中包含一个名为 Tags 的实体。现在,这个SQL为我提供了正确的实体2 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吗?
教义 ORM array
类型作为序列化数据保存在数据库中。由于它只是一个字符串,因此您无法根据需要进行此类查询。您有两种可能的方法可以解决它:
- 为具有多对多或多对一关系的标签使用单独的表
- 使用原则
simple_array
类型保存标记,然后使用全文搜索查询它们。全文并非适用于所有RDBMS,因此您可能需要一些搜索服务器,如狮身人面像或类似服务器。
我使用:
$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);
Doctrine2 symfony2 simple-array json-array