数组字段包含元素的原则
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组字段包含元素的原则相关的知识,希望对你有一定的参考价值。
我有一个具有array
属性的实体:
/**
* @var array
*
* @ORMColumn(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', '%' . $element . '%')
->getQuery()
->getResult()
;
这是SQL 'SELECT ... LIKE e.provinces LIKE "%'.$element.'%";'
的等价物
但是因为你在问题中包含了[sql]标签,我想告诉你,这不是处理这种情况的正确方法,你的数据库违反了1NF。在Web开发中,通常违反规范化表单,您可以在内容管理系统存储配置时看到它,但它们不会尝试查询这些配置参数。在您的情况下,您希望查询省份,因此通常您应该很难查询索引字段,以提高查询的性能。
因此,解决方案可能是创建省实体并用array
关系替换ManyToMany
类型。
以上是关于数组字段包含元素的原则的主要内容,如果未能解决你的问题,请参考以下文章