我有一个实体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
有人可以帮我这个吗?
答案 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();