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();