Php 使用addMetaResult时,Doctrine findAll()找不到列
我将条令和结果映射生成器与Php 使用addMetaResult时,Doctrine findAll()找不到列,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我将条令和结果映射生成器与addMetaResult()一起使用。 我在我的存储库中获得了映射到实体的本机查询,它工作得很好,代码结构如下: $rsm = new ResultSetMappingBuilder($entityManager); $rsm->addRootEntityFromClassMetadata('AppBundle\Entity\Example', 'e'); $rsm->addFieldResult('e', 'id', 'id'); $rsm-&g
addMetaResult()
一起使用。
我在我的存储库中获得了映射到实体的本机查询,它工作得很好,代码结构如下:
$rsm = new ResultSetMappingBuilder($entityManager);
$rsm->addRootEntityFromClassMetadata('AppBundle\Entity\Example', 'e');
$rsm->addFieldResult('e', 'id', 'id');
$rsm->addMetaResult('e', 'value', 'value');
$sql = "SELECT id, 5 as value FROM table";
$query = $entityManager->createNativeQuery($sql, $rsm)
$result = $query->getResult();
$this->exampleRepo->find(5);
$entityResults = [];
/**
* return array of arrays like: [
* ['example' => Example entity, 'value' => int value],
* ['example' => Example entity, 'value' => int value],
* ]
*/
$results = $em
->createQuery('SELECT e AS example, 5 AS value FROM AppBundle:Example')
->getResult();
foreach ($results as $result) {
$result['example']->setValue($result['value]);
$entityResults[] = $result['example'];
}
return $entityResults;
My entity.yml看起来像:
AppBundle\Entity\Example:
...
fields:
id:
type: smallint
nullable: false
options:
unsigned: true
id: true
generator:
strategy: IDENTITY
value:
type: integer
但当我在其他地方使用该实体时,使用标准的实体管理器方法如下:
$rsm = new ResultSetMappingBuilder($entityManager);
$rsm->addRootEntityFromClassMetadata('AppBundle\Entity\Example', 'e');
$rsm->addFieldResult('e', 'id', 'id');
$rsm->addMetaResult('e', 'value', 'value');
$sql = "SELECT id, 5 as value FROM table";
$query = $entityManager->createNativeQuery($sql, $rsm)
$result = $query->getResult();
$this->exampleRepo->find(5);
$entityResults = [];
/**
* return array of arrays like: [
* ['example' => Example entity, 'value' => int value],
* ['example' => Example entity, 'value' => int value],
* ]
*/
$results = $em
->createQuery('SELECT e AS example, 5 AS value FROM AppBundle:Example')
->getResult();
foreach ($results as $result) {
$result['example']->setValue($result['value]);
$entityResults[] = $result['example'];
}
return $entityResults;
然后我得到一个错误:
未找到列:“字段列表”中的1054未知列“t0.value”
这是因为我的表中没有真正的列“value”,它是元列。如果该列不在本机查询中,是否有任何配置可以跳过该列;如果该列不存在,是否有任何配置可以跳过;如果我必须重写存储库中的方法find()
,并在其中添加映射,是否有配置可以跳过该列?请查看,并针对该问题了解更多上下文
简单的回答是,您遇到了条令的限制,因为您不能拥有看似数据库列但实际上不是的虚拟属性。因此,当您将其添加到您的实体中时。yml:
value:
type: integer
您要告诉的是,在您的示例实体上有一个值列。所以你试图运行的任何条令查询都会被打破。原始查询没有这样做的原因是,您正在运行本机查询,并且自己显式地执行映射
所以你们可能觉得你们找到了一种方法来解决教义的局限性,但你们并没有
最简单的解决方案是在示例实体中维护一个未映射的值字段,然后当需要查询该字段时,只需将其添加到条令查询中,然后手动设置所需内容。大概是这样的:
$rsm = new ResultSetMappingBuilder($entityManager);
$rsm->addRootEntityFromClassMetadata('AppBundle\Entity\Example', 'e');
$rsm->addFieldResult('e', 'id', 'id');
$rsm->addMetaResult('e', 'value', 'value');
$sql = "SELECT id, 5 as value FROM table";
$query = $entityManager->createNativeQuery($sql, $rsm)
$result = $query->getResult();
$this->exampleRepo->find(5);
$entityResults = [];
/**
* return array of arrays like: [
* ['example' => Example entity, 'value' => int value],
* ['example' => Example entity, 'value' => int value],
* ]
*/
$results = $em
->createQuery('SELECT e AS example, 5 AS value FROM AppBundle:Example')
->getResult();
foreach ($results as $result) {
$result['example']->setValue($result['value]);
$entityResults[] = $result['example'];
}
return $entityResults;
如果您想要更具全局性的东西,可以考虑添加一个。是的,我做了,类似这样的事情,但不仅在repo中,而且在entity中,我在getValue方法中而不是在sql中进行计算,并且在query中根本不选择值。真正的查询非常大和复杂,所以我不想用PHP重写它,这就是我问这个问题的原因。但是你的答案对其他人来说是好的,所以我会把它标记为正确的:)听起来不错。您的方法适合您的情况,可能是最快的实现。