sql - 数组字段包含元素的 Doctrine

标签 sql arrays doctrine query-builder

我有一个具有 array 属性的实体:

/**
 * @var array
 *
 * @ORM\Column(name="provinces", type="array")
 */
private $provinces;

如何进行查询以提取包含特定元素的所有实体?像这样的事情:

$entities = $this->createQueryBuilder('e')
    ->where($qb->expr()->contains('e.provinces', ':element'))
    ->setParameter('element', $element)
    ->getQuery()
    ->getResult()
;

最佳答案

首先你要明白Doctrine array type是什么表示,因此基本上 Doctrine 数组类型 会转换为 SQL 文本类型,它只是一个序列化字符串。因此,您可以使用 Doctrine 表达式 like 创建一个查询,这样您的查询将如下所示

$entities = $this->createQueryBuilder('e')
    ->where($qb->expr()->like('e.provinces', ':element'))
    ->setParameter('element', '%' . \serialize($element) . '%')
    ->getQuery()
    ->getResult()
;

这相当于 SQL 'SELECT ... WHERE e.provinces LIKE "%' .\serialize($element) . '%";'


但是因为您在问题中包含了 [sql] 标记,所以我想告诉您,这不是处理此类情况的正确方法,您的数据库违反了 1NF 。在 Web 开发中,违反规范化形式是很常见的事情,您可以看到内容管理系统在存储配置时会这样做,但它们不会尝试查询这些配置参数。就您而言,您希望查询省份,因此通常您应该努力查询索引字段,以提高查询性能。

因此,解决方案可以是创建一个Province Entity并用ManyToMany关系替换array类型。

关于sql - 数组字段包含元素的 Doctrine ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49069921/

相关文章:

java - 如何在一个范围内选择不重复的随机数

php - 从数据库中检索时,Doctrine SQL Server uniqueidentifier 不会转换为 char 或 nvarchar

mysql - 在此 MySQL 过程中,如何在列名称中保持 DRY?

php - 为什么 php 函数不更新数组值

c - 如何将 long long 转换为 C 中的数组?

php - Symfony 表单字段属性 empty_data 被忽略

php - Doctrine 2 与连接表中附加列的多对多关系

mysql - 根据其他表的连接获取列的计数

php - 仅从昨天的数据库中选择 sql

python - 使用原始 SQL 且无参数执行安全 SQL SELECT 语句