2012-01-16 101 views
2

與Dotrine本身相比,可能與SQL更相關。如何對查詢結果中相關(聯合)表的字段進行排序?

我有兩個表,在架構文件大致是這樣規定的:

Project: 
    columns: 
    name: { type: string(255), notnull: true } 

Task: 
    columns: 
    project_id: { type: integer, notnull: true } 
    name: { type: string(255), notnull: true } 
    relations: 
    Project: { onDelete: CASCADE, local: project_id, foreign: id, foreignAlias: Tasks } 

我想獲得一個項目,一個列表它的任務,由名稱排序。

$projectWithTasks = Doctrine_Core::getTable("Project")->createQuery("p") 
    ->leftJoin("p.Tasks t") 
    ->where("p.id = ?", $projectId) 
    ->orderBy("t.name ASC") 
    ->fetchOne(); 

很明顯,它不會工作。我一直在尋找解決方案,但可能我使用了錯誤的詞語,因爲我找不到任何有用的信息。我會非常感謝任何幫助。

+0

嗯,奇怪。我看不出爲什麼這不起作用。另一種方法是,如果您始終希望按照相同的條件排序,則可以在映射中指定順序。看看這個例子http://www.doctrine-project.org/blog/cookbook-recipe-relation-dql-behavior – ZolaKt 2012-01-17 13:07:00

+0

好吧,我看起來像我錯了,說這不起作用,似乎足夠這個簡單例。 – Przemek 2012-01-18 11:01:17

回答

1

您可以定義任務的默認順序在陽明文件項目的關係,例如:

Project: 
    columns: 
    name: { type: string(255), notnull: true } 
    relations: 
    Task: 
     local: id 
     foreign: project_id 
     orderBy: name 

Task: 
    columns: 
    project_id: { type: integer, notnull: true } 
    name: { type: string(255), notnull: true } 

這樣,通過項目得到了當你的任務自動按名稱排序。

1

,如果你想使用選擇「T」在您的查詢,你應該把它定義爲選擇方法:

$projectWithTasks = Doctrine_Query::create() 
    ->select('p.*, t.*') 
    ->from('Project p') 
    ->leftJoin('p.Tasks t') 
    ->where('p.id = ?', $projectId) 
    ->orderBy('t.name ASC') 
    ->fetchOne(); 

或者你可以用你的語法,只需更換「T」中的排序依據「p.Tasks」:

$projectWithTasks = Doctrine_Core::getTable("Project")->createQuery("p") 
    ->leftJoin("p.Tasks t") 
    ->where("p.id = ?", $projectId) 
    ->orderBy("p.Tasks.name ASC") 
    ->fetchOne(); 
相關問題