我的主要实体poi
与我的另外两个实体people
和places
有两个OneToOne
关系。
应用/实体/人员.php
class People
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMOneToOne(targetEntity="AppEntityPoi", cascade={"persist", "remove"})
* @ORMJoinColumn(nullable=false)
*/
private $poi;
应用/实体/地点.php
class Places
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMOneToOne(targetEntity="AppEntityPoi", cascade={"persist", "remove"})
*/
private $poi;
现在我需要将people
和places
放在同一个数组或其他东西中。我通过合并两个查询得到了它:
$query = $entityManager->createQuery('select p from App:People p'); //same for places then merge in array...
问:有没有办法用一个 DQL 查询获得相同的结果?(特别是如果实体没有相同的列(。
要简单地将所有People
和Places
都放在一个数组中,您可以使用:
$query = $entityManager->createQuery('select people, places from App:People people, App:Places places');
我想你会想为给定的Poi
获取它们,在这种情况下,如果你只有poi id,你可以试试这个:
$query = $entityManager
->createQuery('select people, places from App:People people, App:Places places where people.poi = :poi and places.poi = :poi')
->setParameter('poi', $poiId)
;
当然,如果您有一个Poi
实体对象可供您使用,您可以简单地执行
$peopleAndPlaces = [$poi->getPeople(), $poi->getPlaces()]
请注意,为了使上述代码正常工作,您必须将这些方法添加到相应的实体类中,并确保与Poi
的关系是双向的
如果出于某种原因经常需要获取该数组,并且您有一个Poi
实体对象,则最好向Poi
类添加一个方法
class Poi
{
...
public function getPeopleAndPlaces()
{
return [$this->getPeople(), $this->getPlaces()];
}
然后在需要时致电$poi->getPeopleAndPlaces()
。