我有一个带连接条件的连接查询。它工作正常,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;
}
这些实体列表不完整,但所有相关部分都应该在那里。