Sql 从条令2和Zend框架中的关联中提取数据

Sql 从条令2和Zend框架中的关联中提取数据,sql,zend-framework,doctrine,doctrine-orm,Sql,Zend Framework,Doctrine,Doctrine Orm,我在项目中定义了一个简单的实体结构: 国家>地区>省份>城镇 定义如下: class Town { /** * @Id @Column(type="integer") * @GeneratedValue(strategy="AUTO") */ private $id; /** @Column(type="string", length=30,unique=FALSE) */ private $townname; /** @

我在项目中定义了一个简单的实体结构:

国家>地区>省份>城镇

定义如下:

class Town
{
    /**
     * @Id @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    private $id;

    /** @Column(type="string", length=30,unique=FALSE) */
    private $townname;

    /** @Column(type="boolean") */
    private $active;

    // so that we know when a user has added a town
    /** @Column(type="boolean") */
    private $verified;


    /**
     * @ManyToOne(targetEntity="Province")
     * @JoinColumn(name="provinces_id", referencedColumnName="id",nullable=FALSE)
     */
    private $provinces_id;
等等

嗯。你明白了

现在,如果一个用户有一个城镇(多对一),那么我想知道该用户的省份、地区和国家。我可以为使用SQL或DQL提供此数据的城镇实体创建一个存储库方法。比如:

SELECT `users`.`towns_id`,`towns`.`provinces_id`,`regions`.`countries_id`,`provinces`.`regions_id` FROM users , `regions`
LEFT JOIN `towns` ON `users`.`towns_id` = `towns`.`id` 
LEFT JOIN `provinces` ON `towns`.`provinces_id` = `provinces`.`id` 
但这似乎是错误的,特别是因为该学说已经“了解”了城镇、省份、地区和国家实体之间的关系


有更简单的方法吗?

最后我是这样做的:

我做了双向关联(尽管这可能不是必需的):

您可以简单地引用以下国家/地区的用户:

$user = new \Entities\User;
$user = $this->em->getRepository('Entities\User')->findOneByFirstname('test');

$country=$user->getTowns_id()->getProvinces_id()->getRegions_id()->getCountries_id()->getCountryname();

这完全取决于您希望如何从数据库中检索这些实体。如果希望最小化针对db发送的SQL语句,那么使用DQL可能更好

因此,对于您的情况,我将添加一些DQL:

$dql = 'SELECT u, t, p, r, c FROM User u JOIN u.towns_id t JOIN t.provinces_id p JOIN p.regions_id r JOIN r.countries_id c WHERE u.firstname = ?1';
$user = $this->em->createQuery($dql)->setParameter(1, 'test')->getResults();

$country = $user->getTowns_id()->getProvinces_id()->getRegions_id()->getCountries_id()->getCountryname();
DQL操作类及其属性(操作表列)。因此,通过编写DQL,您实际上是在使用关于实体关联的“知道”原则

仅使用一行时,上述结果集等效:

$country = $user->getTowns_id()->getProvinces_id()->getRegions_id()->getCountries_id()->getCountryname();
但是,使用一个SQL选择查询(在引擎盖下使用连接)而不是3个选择可以得到相同的结果。这样会跑得更快

$country = $user->getTowns_id()->getProvinces_id()->getRegions_id()->getCountries_id()->getCountryname();