Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用addMetaResult时,Doctrine findAll()找不到列_Php_Symfony_Doctrine Orm - Fatal编程技术网

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重写它,这就是我问这个问题的原因。但是你的答案对其他人来说是好的,所以我会把它标记为正确的:)听起来不错。您的方法适合您的情况,可能是最快的实现。