Zend framework 将DQL与Doctrine2实体和Zend框架一起使用时感到困惑

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

我有4个实体:国家、地区、省、镇

<?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');
    }