1

我正在尝试做的事情:

对一个也连接到其他表的表执行带有半正弦计算的查询

出了什么问题:

ORM 级别的关联无法通过我尝试的方法正常工作/补水,看起来

细节

我觉得如果我剪切并跳过所有相关的代码,这个问题会变得很大,所以我将尝试将它保留在相关的东西上。

首先,这是正在查询的主表的关联映射,这是问题

/**
 * @var IssueType $type
 *
 * @ORM\ManyToOne(targetEntity="IssueType")
 * @ORM\JoinColumn(name="type_id", referencedColumnName="id")
 */
protected $type;

注意:实际上还有其他四个关联表,但上面的一个是“先失败”,所以我希望如果我能解决这个问题,我可以为其余的

现在,直接从本文工作并从此处获取一些提示,我正在尝试从指定地理半径内的问题表中提取数据。但是,与文章中的示例不同,我的数据在单个表中并不平坦。IssueRepository在我的班级中输入我的自定义查找器:

public function findNear( $em, $point, $radius=1 )
{
  $rsm = new ResultSetMapping();

  $rsm->addEntityResult('MyBundle:Issue', 'i');
  $rsm->addFieldResult('i', 'id', 'id');
  $rsm->addFieldResult('i', 'title', 'title');
  $rsm->addFieldResult('i', 'detail', 'detail');
  $rsm->addFieldResult('i', 'lat', 'lat');
  $rsm->addFieldResult('i', 'lng', 'lng');

  $rsm->addJoinedEntityResult('MyBundle:IssueType' , 't', 'i', 'type');
  $rsm->addFieldResult('t', 'name', 'name');

  $query = $em->createNativeQuery(
    "SELECT i.*
          , ( 3959 * acos( cos( radians(?) ) * cos( radians( i.lat ) ) *
            cos( radians( i.lng ) - radians(?) ) + sin( radians(?) ) *
            sin( radians( i.lat ) ) ) ) AS distance
          , t.name as type_name
       FROM issue i
       LEFT JOIN issue_type t
         ON i.type_id = t.id
      GROUP BY i.id, t.name
     HAVING ( 3959 * acos( cos( radians(?) ) * cos( radians( i.lat ) ) *
            cos( radians( i.lng ) - radians(?) ) + sin( radians(?) ) *
            sin( radians( i.lat ) ) ) ) < ?
      ORDER BY distance"
    , $rsm
  );

  $query->setParameter( 1, $point->lat );
  $query->setParameter( 2, $point->lng );
  $query->setParameter( 3, $point->lat );
  $query->setParameter( 4, $point->lat );
  $query->setParameter( 5, $point->lng );
  $query->setParameter( 6, $point->lat );
  $query->setParameter( 7, $radius, Type::INTEGER );

  return $query->getResult();
}

现在有点乱,但我只是想让它工作。一旦我尝试IssueTypeIssue对象中提取关联对象,此查询返回的数据就会失败。

foreach ( $issues as $issue )
{
  // Fails, since Issue::getType() returns NULL
  echo $issue->getType()->getName();
}

这导致一个

“在非对象上调用成员函数 getName()”

错误。

现在,我不太了解 Doctrine2 的内部结构,所以我不知道这个基于 ResultSetMapping 的查询与我通常通过 ORM 执行的查询有何不同。

任何人都可以解释一下吗?

版本

  • PHP: 5.4
  • PostgreSQL:9.1
  • Symfony:Symfony 2.1
  • 教义:2.3
4

1 回答 1

1

可能(但我不确定)你必须描述“元列”

$rsm->addMetaResult('i', 'type_id', 'type');
于 2012-09-27T22:53:20.657 回答