数组字段包含元素的原则

时间:2018-03-02 13:18:04

标签: 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()
;

1 个答案:

答案 0 :(得分:3)

首先,您必须了解Doctrine array type代表的内容,因此基本上 Doctrine数组类型会转换为 SQL文本类型,这只是一个序列化串。因此,您可以使用教义表达式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关系。