以下是我实际拥有的模式的摘录
Software:
columns:
title:
type: string(255)
id_publisher:
type: integer
id_developper:
type: integer
Company:
columns:
name:
type: string(255)
nationality:
type: string(255)
如您所见,我的软件模型有两个外部引用:publisher和developper。我希望为这两个参考文献中的每一个创建一对多的关系。问题是他们都是公司。
我首先在我的软件模型上尝试了如下所示的内容,但该关系仅适用于第一个本地引用id_publisher。
relations:
Company:
type: one
foreignType: many
local: [id_publisher, id_developper]
foreign: id
然后我尝试了(总是在软件模型上):
relations:
Publisher:
class: Company
type: one
foreignType: many
local: id_publisher
foreign: id
Developper:
class: Company
type: one
foreignType: many
local: id_developper
foreign: id
但是,当我执行一个查询计算链接到公司的软件数量的查询时......
public function findAllQuery(Doctrine_Query $q = null) {
$q = Doctrine_Query::create()
->select('c.*, COUNT(s.id) AS count_software')
->from('Company c')
->leftJoin('c.Software s')
->groupBy('c.id');
return $q;
}
...只有发布商才会在COUNT子句中考虑。
所以最后,我的问题是,如何处理同一模型的多个一对多关系? 谢谢你的时间!
答案 0 :(得分:3)
也许你应该尝试添加一个外来别名来告诉doctrine在触发查询时要处理哪个关系:
relations:
Publisher:
class: Company
type: one
foreignType: many
foreignAlias: PublishedSoftware
local: id_publisher
foreign: id
Developer:
class: Company
type: one
foreignType: many
foreignAlias: DevelopedSoftware
local: id_developer
foreign: id
在您的查询中,您必须加入两个关系并总结各个计数:
$q = Doctrine_Query::create()
->select('c.*, COUNT(ps.id)+COUNT(ds.id) AS count_software')
->from('Company c')
->leftJoin('c.PublishedSoftware ps')
->leftJoin('c.DevelopedSoftware ds')
->groupBy('c.id')
;
原则默认是使用模型名称作为关系的标识符,因此如果对同一个模型使用多个关系,那么你真的应该重命名至少一个,让doctrine现在就是你的意思。如果没有这个,您将无法像这样检索已发布软件的集合:
$pubSoftware = $myCompany->getPublishedSoftware();
$devSoftware = $myCompany->getDevelopedSoftware();
Doctrine不具备的功能(IMHO)是将两种关系视为同一模型。所以打个电话:
$allSoftware = $myCompany->getSoftware();
不会检索多关系模型上的所有相关软件,而只检索可以通过名为Software
的关系检索的软件。
希望有所帮助,
~~~干杯。