如何在查询结果中对相关(已连接)表的字段进行排序?

时间:2012-01-16 08:27:41

标签: php sql doctrine doctrine-1.2 dql

可能与SQL有关,而不是与Dotrine本身有关。

我有两个表,在模式文件中指定大致如下:

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();

显然,它不起作用。我正在寻找解决方案很长一段时间,但可能我使用了错误的词,因为我找不到任何有用的信息。我会非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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 }

这样,当您通过Project时,您的任务会按名称自动排序。

答案 1 :(得分: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();

或者你可以使用你的语法,只需用“p.Tasks”替换顺序中的“t”:

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