gpt4 book ai didi

sql - 从 Doctrine 2 和 Zend Framework 中的关联中提取数据

转载 作者:行者123 更新时间:2023-12-02 02:19:50 30 4
gpt4 key购买 nike

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

国家>地区>省>市

定义如下:

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`

但这似乎是错误的,特别是因为 Doctrine 已经“知道”城镇、省、地区和国家实体之间的关系。

有更简单的方法吗?

最佳答案

这完全取决于您希望如何从数据库中检索这些实体。如果您想最大程度地减少针对数据库发送的 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,您实际上是在使用关于您的实体关联的 Doctrine 。

上面的结果集只有一行时是等价的:

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

但是您使用一个 SQL SELECT 查询(在引擎盖下使用 JOINS)而不是 3 个 SELECTS 得到相同的结果。这样运行速度会更快。

关于sql - 从 Doctrine 2 和 Zend Framework 中的关联中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8831883/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com