2012-01-16 9 views
2

おそらくDotrine自体よりもSQLに関連しています。クエリ結果で関連する(結合された)テーブルのフィールドをソートする方法は?

私はおおよそ次のようにスキーマファイルで指定された2回の表、持っている:私は名前でソートされたことのタスクのリストでプロジェクトを、取得したいと思い

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

Hmm、strange。なぜこれがうまくいかないのか分かりません。別の方法として、常に同じ条件でソートしたい場合は、マッピングの順序を指定することができます。この例を見てくださいhttp://www.doctrine-project.org/blog/cookbook-recipe-relation-dql-behavior – ZolaKt

+0

まあ、私はそれがうまくいかないと間違っていたように見えますが、この単純な例。 – Przemek

答えて

1

はあなたYMLファイル内のプロジェクトの関係、例えば:

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」を使用する場合は、selectメソッドにそれを定義する必要があります。

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

代わりにあなただけでORDERBYに「T」を置き換える、あなたの構文を使用することができます"p.Tasks":

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