Dcotrine查询生成器:FIND_IN_SET不起作用

时间:2018-02-01 15:16:11

标签: mysql doctrine-orm doctrine

我有一个实体Customer,其simple_array字段为“myNumbers”,例如我的数据库中的值为“12233,45454,99”。 所以我想搜索这个实体,其中包含数字99。 我尝试使用查询构建器和nativeQuery,但我总是收到一条错误,上面写着":Customer not found in params array")

$this->entityManager()->createNativeQuery("SELECT c, FIND_IN_SET(c.myNumbers, :searchNumber) FROM MyBundle:Customer", new ResultSetMapping())->setParameter('searchNumber', $number)->getResult();

Alraedy尝试使用真实的桌面名称“Customer”:

 $this->entityManager()->createNativeQuery("SELECT c, FIND_IN_SET(c.myNumbers, :searchNumber) FROM Customer c", new ResultSetMapping())->setParameter('searchNumber', $number)->getResult();

然后错误是:

Column not foun: 1054 Unkown column "c" in field list 

有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:0)

在本机查询中,您的FROM子句必须指定表名而不是实体。实际上,当Doctrine偶然发现MyBundle:Customer时,它会认为:Customer是一个命名参数,因此您得到的错误是因为之后没有使用该名称设置任何参数。

只需将MyBundle:Customer替换为相应表的名称即可解决问题。您可以使用$entityManager->getClassMetadata('MyBundle:Customer')->getTableName()检索实体的表名。

编辑:如果您在构建查询时遇到问题,那么您应该查看与本机查询相关的Doctrine文档。特别是有关ResultSetMappingBuilder的部分。正确选择所需字段的最简单方法是使用该工具为您生成select子句,并正确映射结果集,以便随后为Customer实体加水。

以下是根据您的示例修改的代码示例:

$em = $this->entityManager();
$tableName = $em->getClassMetadata('MyBundle:Customer')->getTableName();
$tableAlias = 'c';

$rsm = new ResultSetMappingBuilder($em);
$rsm->addRootEntityFromClassMetadata('MyBundle:Customer', $tableAlias);

$query = $em->createNativeQuery('SELECT ' . $rsm->generateSelectClause([$tableAlias => $tableAlias]) . ' 
    FROM ' . $tableName . ' ' . $tableAlias . '
    WHERE FIND_IN_SET(c.myNumbers, :searchNumber)
', $rsm);

$query->getResult();