2011-06-09 66 views
1

这里的关系是架构的摘录其实我有主义/ Symfony的 - 多一个一对多的同一型号

Software: 
    columns: 
    title: 
     type: string(255) 
    id_publisher: 
     type: integer 
    id_developper: 
     type: integer 

Company: 
    columns: 
    name: 
     type: string(255) 
    nationality: 
     type: string(255) 

正如你看到的,我的软件模型有两个外部引用:出版商和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条款中考虑到了。所以最后,我的问题是,如何处理同一模型的多个一对多关系? 感谢您的时间!

回答

3

也许你应该尝试添加一个外国别名告诉学说的关系来处理发射查询时:

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

教义默认使用的型号名称作为标识符的关系,因此,如果使用超过一个关系到相同型号你真的应该重新命名至少一个,让你的意思主义现在该怎么办。如果没有这个,你就不能只检索已发布软件的集合,像这样:

$pubSoftware = $myCompany->getPublishedSoftware(); 
$devSoftware = $myCompany->getDevelopedSoftware(); 

是什么主义不能够(恕我直言)是这两个关系处理到相同型号为一体。于是打电话:

$allSoftware = $myCompany->getSoftware(); 

不会检索所有相关软件对多关系模型,但只有那些可以被称为Software的关系进行检索。

希望有帮助,

~~~干杯。

+0

这是我做到的方式,谢谢jek;) – 2011-07-03 09:35:06