Слишком много запросов к базе данных в Symfony и Doctrine

схема.yml:

JobeetCategory:
  actAs: { Timestampable: ~ }
  columns:
    name: { type: string(255), notnull: true, unique: true }

JobeetJob:
  actAs: { Timestampable: ~ }
  columns:
    category_id:  { type: integer, notnull: true }
    name:         { type: string(255) }
  relations:
    JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id, foreignAlias: JobeetJobs }

действие.класс:

public function executeIndex(sfWebRequest $request)
  {
    $this->jobeet_job_list = Doctrine::getTable('JobeetJob')
      ->createQuery('a')
      ->execute();
  }

и шаблон:

<table>
    <?php foreach ($jobeet_job_list as $jobeet_job): ?>
    <tr>
      <td><?php echo $jobeet_job->getcategory_id() ?></td>
      <td><?php echo $jobeet_job->getName() ?></td>
    </tr>
    <?php endforeach; ?>
</table>

Эти шаблоны сгенерировали только 2 запроса к базе данных. Хорошо. Но если я сделаю:

<table>
    <?php foreach ($jobeet_job_list as $jobeet_job): ?>
    <tr>
      <td><?php echo $jobeet_job->getJobeetCategory()->getName() ?></td>
      <td><?php echo $jobeet_job->getName() ?></td>
    </tr>
    <?php endforeach; ?>
</table>

И у меня есть в базе данных 100 JobeetJob, тогда это сгенерировало 102 запроса к базе данных! Это слишком много! Можно ли уменьшить это?


person Shon Nocolis    schedule 11.01.2012    source источник


Ответы (1)


В настоящее время вы «лениво загружаете» объекты JobeetCategory. Это неэффективно, если вы знаете, что вам придется делать это много раз. Вы должны выполнить соединение с исходным запросом:

$this->jobeet_job_list = Doctrine::getTable('JobeetJob')
  ->createQuery('a')
  ->leftJoin('a.JobeetCategory c')
  ->execute();

Это означает, что все соответствующие объекты JobeetCategory будут извлечены из базы данных и сразу же обработаны, поэтому вам не придется лениво загружать их позже. Это должно вернуть вас к 2 запросам.

person lonesomeday    schedule 11.01.2012