数组字段包含元素的原则

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类型。

以上是关于数组字段包含元素的原则的主要内容,如果未能解决你的问题,请参考以下文章

解释'空'C数组(int a = {};)

MongoDB:如何找出数组字段是不是包含元素?

Go切片实现

JavaScript单行代码,也就是代码片段

在类中定义数组的方法和字段

js简洁代码片段