Symfony2 查询数组匹配



我正在尝试使用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类型作为序列化数据保存在数据库中。由于它只是一个字符串,因此您无法根据需要进行此类查询。您有两种可能的方法可以解决它:

  1. 为具有多对多或多对一关系的标签使用单独的表
  2. 使用原则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

相关内容

  • 没有找到相关文章