2013-04-15 40 views
1

我使用學說1.2,這裏是我的架構:訂單原則如何查詢多對多關係?

ProviderProduct: 
columns: 
    provider_id: 
    type: integer 
    primary: true 
    product_id: 
    type: integer 
    primary: true 
    num: 
    type: integer 
    default: 0 
    unsigned: true 
Provider: 
columns: 
    name: {type: string(255), notnull: true, notblank: true, unique: true} 
relations: 
    Products: 
    class: Product 
    local: provider_id 
    foreign: product_id 
    refClass: ProviderProduct 
Product: 
columns: 
    #a lot of columns 
relations: 
    Providers: 
    class: Provider 
    local: product_id 
    foreign: provider_id 
    refClass: ProviderProduct 

我要的是得到,最大NUM產品(這是ammount的)特定的供應商。 我嘗試此查詢:

$query = Doctrine_Query::create()->select('p.*') 
            ->from('Product p') 
            ->innerJoin('p.Providers pr') 
            ->where('pr.name = ?', 'WhiteStore') 
            ->orderBy('ProviderProduct.num'); 
$query->fetchOne(); 

結果SQL查詢:

SELECT p.* FROM product p 
INNER JOIN provider_product p3 ON (p.id = p3.product_id) 
INNER JOIN provider p2 ON p2.id = p3.provider_id, provider_product p4 
WHERE (p2.name = ?) ORDER BY p4.num 

正如你可以看到它通過NUM場犯規秩序。那麼,我的任務的正確dql是什麼?

回答

0

How order doctrine query for many-to-many relationship?

你可以用以下結構:

$query = Doctrine_Query::create()->select('p.*') 
->from('Product p') 
->innerJoin('p.Providers pr') 
->where('pr.name = ?', 'WhiteStore') 
->orderBy('p.Providers.ProviderProduct.num'); 

學說1的不是本機的行爲創造了許多一對多關係的無形的別名。您可以使用此別名來構建正確的訂單。

0

我認爲你需要涉及refClass太:

ProviderProduct: 
    columns: 
    provider_id: 
    type: integer 
    primary: true 
    product_id: 
    type: integer 
    primary: true 
    num: 
    type: integer 
    default: 0 
    unsigned: true 
relations: 
    Provider: { foreignAlias: ProviderProduct } 
    Product: { foreignAlias: ProviderProduct } 

然後通過reffClass涉及到拿到號碼:

$query = Doctrine_Query::create()->select('p.*') 
    ->from('Product p') 
    ->innerJoin('p.ProviderProduct pp') 
    ->innerJoin('pp.Provider pr') 
    ->where('pr.name = ?', 'WhiteStore') 
    ->orderBy('pp.num DESC') // to get de max first 
    ->groupBy('p.id') // if any duplicates 
    ->limit(1); 

$product = $query->fetchOne();