我有一个具有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()
;
答案 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
关系。