Symfony2 / Doctrine2从两个表中获取数据

时间:2015-02-24 15:15:52

标签: php symfony doctrine-orm

我有一个包含一些数据的警报类。然后我有一个可用性类。在我的可用性类中,我有

/**
 * @var \Nick\AlertBundle\Entity\Alert
 *
 * @ORM\ManyToOne(targetEntity="Nick\AlertBundle\Entity\Alert")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="availability_alert_id", referencedColumnName="id")
 * })
 */
private $availabilityAlert;

所以这是一个返回我的Alert类的外键,链接到我的Alerts类id。

我现在正在对可用性数据做一些工作,所以我有DQL查询

public function getAlertAvailability($id)
{
    return $this->getEntityManager()
        ->createQuery(
            'SELECT a.id, a.classLetter, a.flightNumber, a.alertPseudo, a.availability, a.lastUpdated
                FROM NickAlertBundle:Availability a
                WHERE a.availabilityAlert = :id
                ORDER by a.classLetter, a.lastUpdated'
        )
        ->setParameter('id', $id)
        ->getResult();
}

我称之为的方式就是这样

public function getAvailabilityData(){
        $alerts = $this->em->getRepository('NickAlertBundle:Alert')->getActiveAlertIds();

        if (!$alerts) {
            echo "No Availability";
        }

        foreach($alerts as $alert){
            $alertId = (int)$alert['id'];
            $allAvailability = $this->em->getRepository('NickAlertBundle:Availability')->getAlertAvailability($alertId);
        }
}

所以我基本上获取了所有活动的警报ID,然后通过它来获取这些单独警报的可用性。

现在我有几个问题。

首先,在我做的DQL查询中,我还需要从我的Alert表(一个名为command的字段)中获取一些内容。如何在此查询中加入以获取此数据?

其次,使用返回的数据,如何访问Twig文件中的availabilityAlert?

更新 尝试加入

public function getAlertAvailability()
{
    return $this->getEntityManager()
        ->createQuery(
            'SELECT a.id, a.classLetter, a.flightNumber, a.alertPseudo, a.availability, a.lastUpdated, u.searchCommand
                FROM NickAlertBundle:Availability a
                JOIN a.availabilityAlert u
                ORDER BY a.classLetter, a.lastUpdated'
        )
        ->getResult();
}

1 个答案:

答案 0 :(得分:2)

当加载可用性实体时,Doctrine将加载该实体作为代理(用于延迟加载)。

您可以通过正常的getter / property访问来访问它们,但它们通常会被Doctrine延迟加载。您可以通过DQL查询加入它们,并且该属性将与已加载的所有链接实体保持一致,请参阅Improving Performance with a Join

然后,您可以像在任何其他财产中一样访问Twig中的相关实体。