You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Doctrine Query Builder数组实体查询报错的解决求助

问题解决:JSON数组字段的查询筛选错误

错误原因

你使用的MEMBER OF语法是Doctrine ORM专门用于**关联集合(如OneToMany、ManyToMany关系字段)**的元素检查,而eventTypeIds是通过json类型存储的普通数组属性,并非ORM关联字段,因此触发语义错误。

解决方案

根据你使用的数据库类型,选择对应的查询方式:

1. MySQL数据库:使用JSON_CONTAINS函数

public function findQuestionsByEventType(int $eventTypeId)
{
    $queryBuilder = $this->createQueryBuilder('item')
        ->andWhere('JSON_CONTAINS(item.eventTypeIds, :eventTypeId) = 1')
        ->setParameter('eventTypeId', json_encode($eventTypeId))
        ->orderBy('item.sortOrder', 'ASC');

    return $queryBuilder->getQuery()->getResult();
}

注意:需要将$eventTypeId转为JSON字符串,匹配MySQL的JSON格式检查要求。

2. PostgreSQL数据库:使用@>包含操作符

public function findQuestionsByEventType(int $eventTypeId)
{
    $queryBuilder = $this->createQueryBuilder('item')
        ->andWhere('item.eventTypeIds @> :eventTypeId')
        ->setParameter('eventTypeId', json_encode([$eventTypeId]))
        ->orderBy('item.sortOrder', 'ASC');

    return $queryBuilder->getQuery()->getResult();
}

PostgreSQL的@>操作符用于检查左侧JSON数组是否包含右侧的JSON数组元素,因此需要将单个ID包装为数组后转JSON。

3. 跨数据库通用方案:Doctrine JSON_ARRAY_CONTAINS(ORM 2.10+)

如果你的Doctrine ORM版本在2.10及以上,可以使用内置的跨数据库JSON数组检查函数:

public function findQuestionsByEventType(int $eventTypeId)
{
    $queryBuilder = $this->createQueryBuilder('item')
        ->andWhere('JSON_ARRAY_CONTAINS(item.eventTypeIds, :eventTypeId)')
        ->setParameter('eventTypeId', $eventTypeId, \Doctrine\DBAL\Types\Types::INTEGER)
        ->orderBy('item.sortOrder', 'ASC');

    return $queryBuilder->getQuery()->getResult();
}

该函数会自动适配不同数据库的语法,无需手动处理JSON格式转换。


内容的提问来源于stack exchange,提问作者Maksim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:54:19