我要做的事情:
对同时联接到其他表的表执行具有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');