Слишком много запросов к базе данных в 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 запроса к базе данных! Это слишком много! Можно ли это уменьшить?
1 ответ:
В настоящее время вы" лениво загружаете " объекты
JobeetCategory
. Это неэффективно, если вы знаете, что вам придется делать это много раз. Вы должны выполнить соединение на начальном запросе:$this->jobeet_job_list = Doctrine::getTable('JobeetJob') ->createQuery('a') ->leftJoin('a.JobeetCategory c') ->execute();
Это означает, что все соответствующие объекты JobeetCategory будут извлечены из базы данных и гидратированы сразу, так что вам не придется лениво загружать их позже. Это должно вернуть вас к 2 запросам.