2011-06-09 49 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