Doctrine 1.2 запрос соединяет многих со многими - PullRequest
1 голос
/ 13 июня 2011

Допустим, у меня есть следующие многие ко многим с заданиями и пользователями

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

можно ли запросить задание и затем присоединиться к job.assignment, чтобы результат возвращал все задания, а затем также возвращает дополнительные строкикаждая вакансия. назначение?

1 Ответ

2 голосов
/ 23 июня 2011

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

В этом случае вам нужно добавить отношение от задания к назначению. Если вы хотите сделать обратное, получить список пользователей и присоединиться к их заданиям, используйте:

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

Первый запрос даст вам все задания, даже без заданий. Во-вторых, все пользователи, а также те, кто не назначен. Третий, назначения, которые будут иметь пользователей и вакансии, если они требуются.

...