2011-12-23 64 views
0

我有一個時間轉換以下原料MySQL查詢,它已經過測試,效果非常好,成學說1.2赫克:生的MySQL翻譯成學說1.2

SELECT 
    r.name AS regionname, 
    s.name AS statename 
FROM 
    job j 
LEFT JOIN 
    community c ON c.id = j.community_id 
LEFT JOIN 
    state s ON s.id = c.state_id 
LEFT JOIN 
    region r ON r.id = s.region_id 
WHERE 
    r.id = 1 

這不起作用:

$q = Doctrine_Query::create() 
    ->select('r.name AS regionname', 's.name AS statename') 
    ->from('job j') 
    ->leftJoin('community c ON c.id = j.community_id') 
    ->leftJoin('state s ON s.id = c.state_id') 
    ->leftJoin('region r ON r.id = s.region_id') 
    ->where('r.id = 1') 
    ->execute(); 

這裏是我的數據庫結構,如果它是有用的:

job: 
columns: 
    id 
    community_id 
relations: 
    community: local_key: community_id, foreign_key: id, foreignAlias: Communitys 

community: 
columns: 
    id 
    state_id 
relations: 
    state: local_key: state_id, foreign_key: id, foreignAlias: States 

state: 
columns: 
    id 
    name 
    region_id 
relations: 
    region: local_key: region_id, foreign_key: id, foreignAlias: Regions 

region: 
columns: 
    id 
    name 

回答

0

我已經注意到了同樣的事情,好。在Doctrine 1.2中加入與mysql有點不同。要進行聯結,您必須利用Doctrine在工作類中的每個組件中創建的關係。

你可以檢查我正在談論的這些關係的作業的基類。在設置方法,它們看起來像這樣的例子在工作表中的社區外鍵ID:

$this->hasOne('community as Communitys', array(
     'local' => 'community_id', 
     'foreign' => 'id')); 

回到你的問題,做加盟,你必須引用表的別名,其中國外鍵屬於。例如,如果你想加入的社羣表格與別名社區:中

->leftJoin('j.Community') 

代替

community c ON c.id = j.community_id 

注意,我沒有說加入的ID,因爲在1.2學說中已暗示。然而,你可以選擇加入別的東西。

同樣,如果表您以前加入到需要連接到其它表他們有外鍵,你必須

1.使用自己當前queryand 2.reference組件別名爲表示其基類也是如此。

所以,你說你要加入社會狀態在當前查詢你應該做的是

// join job and community first 
->from('job j') 
->leftJoin('j.Community c') 
// join community to state since they are the ones that are related 
->leftjoin('c.States s') 

在這裏,我希望你能看到的圖案的方式。在一天結束時,如果你看它加入的思路還是用原始的SQL相同,唯一的區別是語法:

SQL語法:

LEFT JOIN 
    community c ON c.id = j.community_id 

DQL語法:

->leftJoin('j.Community c') 

反正回答你的問題,這裏是如何的加入應該有所做到:

$q = Doctrine_Query::create() 
    ->select('*') 
    ->from('job j') 
    ->leftJoin('j.Community c') 
    ->leftJoin('c.State s') 
    ->leftJoin('s.Region r') 
    ->where('r.id = 1') 
    ->execute(); 
+0

感謝詳細的解答。不幸的是,它不工作。我也試圖關閉外國別名,但它被掛在那些上面。這是我在嘗試使用它們時遇到的錯誤:「未知關係別名社區」每當我嘗試使用它們時,都會收到這些錯誤。我會檢查他們在安裝方法中的內容並重新發布。再次感謝。 – Patrick 2011-12-24 16:38:59

+0

......並且看起來確實是這個問題。沒有社區作爲社區的聲明,只是'社區,陣列(')。這讓我困惑了一下,因爲我的模式確實將它聲明爲外部別名。但是我的模式並沒有將它識別爲一對一的關係。這是問題嗎? – Patrick 2011-12-24 16:47:22

+0

更新:我更改了基類以包含「as」子句(我知道這是不好的形式,如果它最終解決了問題,我會在模式中更改它),並且確實解決了「社區」關係的問題然而,現在它被掛在「國家」條款上,給我一個錯誤,說該工作必須與國家相關......它不在我的模式中......社區與國家相關。任何想法的解決方案? – Patrick 2011-12-24 17:01:01