如何在不忽略连接条件的情况下阅读doctrine连接查询结果?

时间:2018-05-09 17:07:55

标签: php mysql doctrine-orm

我有一个带连接条件的连接查询。它工作正常,getResult()使我可以访问查询结果。结果也很好(在phpmyadmin上查看)。

$em = $this->getDoctrine()->getManager();
$allRows = $em->getRepository('CampaignBundle:Kpi')->createQueryBuilder('k')
            ->leftJoin('k.countryWeights', 'w', 'WITH', 'w.country = :country')
            ->setParameter('country', $country)
            ->addSelect('w')
            ->getQuery()->getResult();

加入的原因是我想检查另一个表(或实体)是否有相关数据,并且我希望将其包含在结果中(如果存在)。这正是左连接的作用。

使用查询结果时出现问题。例如:

foreach ($allRows as $row) {
    $rowOut = array();
    $rowOut['weight'] = ($row->getCountryWeights()) ? $row->getCountryWeights()[0]->getWeight() : 0;
}

相关实体的属性的getter总是允许我访问所有相关数据,就像我的查询中没有连接条件一样。 $row->getCountryWeights()始终为true,因为没有连接条件,连接不为空。如何测试是否有任何数据加入?如何访问已加入的列,例如'weight'?在结果上尝试连接实体的getter似乎不起作用:

Attempted to call an undefined method named "getWeight" 

其他信息:

/**
 * Kpi
 *
 * @ORM\Table(name="kpi")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class Kpi 
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     *
     * @ORM\OneToMany(targetEntity="CampaignBundle\Entity\KpiWeight", mappedBy="kpi", cascade={"ALL"})
     */
    private $countryWeights;
}

/**
 * KPIWeight
 *
 * @ORM\Table(name="kpi_weight")
 * @ORM\Entity
 */
class KpiWeight
{
    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Kpi", inversedBy="countryWeights")
     * @ORM\JoinColumn(name="kpi", referencedColumnName="id", nullable=false)
     */
    private $kpi;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="ZoneBundle\Entity\Country", inversedBy="countryObjectives")
     * @ORM\JoinColumn(name="country", referencedColumnName="id", nullable=false)
     */
    private $country;

    /**
     * @var float
     * @ORM\Column(name="weight", type="float")
     */
    private $weight;
}

这些实体列表不完整,但所有相关部分都应该在那里。

0 个答案:

没有答案