通过针对具有连接的表的自定义查询,使Doctrine 2 ORM水合对象

时间:2012-09-27 02:50:14

标签: postgresql orm symfony doctrine-orm symfony-2.1

我正在尝试做什么:

对一个也加入其他表的表进行半字计算的查询

出了什么问题:

ORM级别的协会在我正在尝试的方法上没有正常工作/保湿,似乎

详情

我觉得如果我剪切并浏览每一段相关的代码,这个问题就会变成 huge ,所以我会尝试将它保存到相关的东西中。

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

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

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

现在,直接从this article开始工作并从here获取一些提示,我正在尝试从指定地理范围内的问题表中提取数据。但是,与文章中的示例不同,我的数据在单个表中并不平坦。在我的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();
}

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

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

1 个答案:

答案 0 :(得分:1)

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

$rsm->addMetaResult('i', 'type_id', 'type');