数组字段包含元素的原则

问题描述 投票:2回答:1

我有一个具有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()
;
sql arrays doctrine query-builder
1个回答
3
投票

首先,您必须了解Doctrine array type表示的内容,因此基本上Doctrine数组类型转换为SQL文本类型,它只是一个序列化字符串。因此,您可以使用doctrine表达式like创建查询,以便您的查询看起来像这样

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

这是SQL 'SELECT ... LIKE e.provinces LIKE "%'.$element.'%";'的等价物


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

因此,解决方案可能是创建省实体并用array关系替换ManyToMany类型。

© www.soinside.com 2019 - 2024. All rights reserved.