2011-06-13 69 views
1

说我有以下多对多使用作业和用户学说1.2查询加入多对多

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

是它可以查询工作,然后加入job.assignment使得结果返回的所有作业,然后还会为每个job.assignment返回附加行?

回答

2

原则,当使用默认的记录水合作用时,返回对象和关系到其他对象。在这种模式下,您可以编写大量查询以获得您想要的内容,具体取决于您将如何处理它们。找到工作的清单,并抓住所有的相关的作业和用户的使用:

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

在这种情况下,你需要从工作添加关系分配。如果你想要做的相反,得到用户的列表,并加入到他们的工作,使用方法:

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

第一个查询会给你所有的工作,甚至是那些没有分配。第二,所有用户,也是没有任务的用户。第三,任务,如果需要的话,将有用户和工作。