我正在尝试做的事情:
对一个也连接到其他表的表执行带有半正弦计算的查询
出了什么问题:
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();
}
现在有点乱,但我只是想让它工作。一旦我尝试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