1

假设我有以下多对多的工作和用户

 Assignment:
  columns:
    job_id:
      ....
    user_id:
      ....
 relations:
    user:
      local: user_id
      foreign: id
    job:
      local: job_id
      foreign: id

是否可以查询 Job 然后加入 job.assignment 以便结果返回所有作业,然后还为每个 job.assignment 返回额外的行?

4

1 回答 1

2

当使用默认的 Record hydration 时,Doctrine 返回对象和与其他对象的关系。在这种模式下,您可以编写许多查询来获得所需的内容,具体取决于您要对它们执行的操作。要获取作业列表,并获取所有相关的作业和用户,请使用:

$jobs = Doctrine_Query::create()
  ->from('Job j')
  ->leftJoin('j.Assignments a')
  ->innerJoin('a.user u')
  ->execute();
foreach($jobs as $job) {
  foreach($job->Assignments as $assignment) {
    $user = $assignment->user;
    // do something with $job and $user here
  }
}

在这种情况下,您需要添加从 Job 到 Assignment 的关系。如果您想反过来,获取用户列表并加入他们的工作,请使用:

$users = Doctrine_Query::create()
  ->from('User u')
  ->leftJoin('u.Assignments a')
  ->innerJoin('a.job j')
  ->execute();
foreach($users as $user) {
  foreach($user->Assignments as $assignment) {
    $job = $assignment->job;
    // do something with $job and $user here
  }
}

在这种情况下,您需要从 User 到 Assignment 的关系。

您甚至可以从作业开始,如果这是您正在寻找的:

$assignments = Doctrine_Query::create()
  ->from('Assignment a')
  ->innerJoin('a.user u')
  ->innerJoin('a.job j')
  ->execute();
foreach($assignments as $assignment) {
    $user = $assignment->user;
    $job = $assignment->job;
    // do something with $job and $user here
}

第一个查询将为您提供所有工作,即使是没有分配的工作。第二,所有用户,也包括没有分配的用户。第三,分配,如果需要,将有用户和作业。

于 2011-06-23T03:38:19.277 回答