对一个也加入其他表的表进行半字计算的查询
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执行的查询有何不同。
任何人都能解释一下吗?
答案 0 :(得分:1)
可能(但我不确定)你必须描述“元列”
$rsm->addMetaResult('i', 'type_id', 'type');