Doctrine 1.2查询加入了很多对很多

时间:2011-06-13 03:41:29

标签: doctrine-1.2

说我有多个工作和用户

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

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

1 个答案:

答案 0 :(得分:2)

Doctrine,当使用默认的Record水合时,将对象和关系返回给其他对象。在此模式下,您可以编写大量查询以获取所需内容,具体取决于您将要执行的操作。要获取作业列表,并获取所有相关的作业和用户,请使用:

$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
  }
}

在这种情况下,您需要从用户到分配的关系。

如果您正在寻找,那么您甚至可以从作业开始:

$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
}

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