【问题标题】:Doctrine 1.2 query join many to manyDoctrine 1.2 查询连接多对多
【发布时间】:2011-06-13 03:41:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: doctrine-1.2


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      相关资源
      最近更新 更多