使用Doctrine 2 ORM对带有联接的表进行自定义查询,使对象水合



我要做的事情:

对同时联接到其他表的表执行具有haversine计算的查询

出了什么问题:

ORM级别的关联在我尝试的方法中没有正常工作/补水,看起来是

详细信息

我觉得如果我剪切并通过每一个相关的代码,这个问题就会变得巨大,所以我会尽量保留相关的内容。

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

/**
* @var IssueType $type
*
* @ORMManyToOne(targetEntity="IssueType")
* @ORMJoinColumn(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();
}

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新