2012-01-16 100 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(); 
相关问题