Zend framework 将DQL与Doctrine2实体和Zend框架一起使用时感到困惑
我有4个实体:国家、地区、省、镇Zend framework 将DQL与Doctrine2实体和Zend框架一起使用时感到困惑,zend-framework,doctrine,doctrine-orm,dql,doctrine-query,Zend Framework,Doctrine,Doctrine Orm,Dql,Doctrine Query,我有4个实体:国家、地区、省、镇 <?php namespace Entities; use Doctrine\Common\Collections\ArrayCollection; /** * @Entity (repositoryClass="Repositories\Region") * @Table(name="regions") * @HasLifecycleCallbacks */ class Region { /** * @Id @Colu
<?php
namespace Entities;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @Entity (repositoryClass="Repositories\Region")
* @Table(name="regions")
* @HasLifecycleCallbacks
*/
class Region {
/**
* @Id @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
private $id;
/** @Column(type="string", length=30,unique=TRUE) */
private $regionname;
/** @Column(type="boolean") */
private $active;
/**
* @ManyToOne(targetEntity="Country", inversedBy="regions")
* @JoinColumn(name="countries_id", referencedColumnName="id",nullable=FALSE)
*/
private $countries_id;
/**
* @OneToMany(targetEntity="Province", mappedBy="provinces")
*/
private $provinces;
public function __construct() {
$this->provinces = new ArrayCollection();
$this->active = true;
}
现在,我想说正题。我如何设置连接并使其工作,以便我们可以通过区域id并返回该区域中的所有城镇
在本机SQL中,我将执行以下操作:
SELECT towns.id
FROM `towns`
INNER JOIN `provinces`
INNER JOIN `regions`
WHERE regions.id =1
谢谢。先做几件事
\u id
命名字段,因为它们不是标识符,而是与其他对象的关系。连接列注释使用真实的数据库名称,对象模型中的字段不使用class Town {
/**
* @ManyToOne(targetEntity="Province", inversedBy="towns")
* @JoinColumn(name="provinces_id", referencedColumnName="id",nullable=FALSE)
*/
private $province;
嗨,谢谢你的观点。我确实有getter和setter,但只是将它们排除在外以缩短代码。您好,我整天都在尝试左连接,不断遇到这个错误:“错误:类实体\Town没有名为province的关联”。我已经尝试了上面的代码(不包括WHERE条件),我得到了同样的错误。有什么想法吗?你应该重新命名私人$provinces\u id;省政府;在你的城市实体,这应该做的把戏!谢谢你们两位。很好用!
public function findActiveTowns($provinces_id = null)
// we can pass in a specific provinces_id if we want
{
$qb = $this->_em->createQueryBuilder();
$qb->select('a.townname, a.id')
->from('Entities\Town', 'a');
if (!is_null($provinces_id)){
$qb->where('a.provinces_id = :provinces_id AND a.active = TRUE')
->setParameter('provinces_id', $provinces_id);
} else {
$qb->where('a.active = TRUE');
}
$towns=$qb->getQuery()->getResult();
// make pairs array suitable for select lists
$options = array();
foreach ($towns as $key => $value) {
$options[$value['id']] = $value['townname'];
}
return $options;
}
SELECT towns.id
FROM `towns`
INNER JOIN `provinces`
INNER JOIN `regions`
WHERE regions.id =1
class Town {
/**
* @ManyToOne(targetEntity="Province", inversedBy="towns")
* @JoinColumn(name="provinces_id", referencedColumnName="id",nullable=FALSE)
*/
private $province;
class Province {
/**
* @ManyToOne(targetEntity="Region", inversedBy="provinces")
* @JoinColumn(name="regions_id", referencedColumnName="id",nullable=FALSE)
*/
private $region;
$qb->select('a.townname, a.id')
->from('Entities\Town', 'a')
->leftJoin('a.province', 'p');
if (!is_null($provinces_id) && !is_null($region_id)){
$qb->where('a.province = :province AND a.active = TRUE')
->andWhere('p.region = :region')
->setParameter('province', $provinces_id)
->setParameter('region', $region_id);
} else {
$qb->where('a.active = TRUE');
}