我有一个具有 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/