架构.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 }
Action 类:
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 个查询到数据库!这太多了!有可能减少这个吗?
最佳答案
您当前正在“延迟加载”JobeetCategory
对象。如果你知道你将不得不做很多次,那么这是低效的。您应该对初始查询进行连接:
$this->jobeet_job_list = Doctrine::getTable('JobeetJob')
->createQuery('a')
->leftJoin('a.JobeetCategory c')
->execute();
这意味着所有相关的 JobeetCategory 对象将从数据库中检索并立即混合,因此您以后不必延迟加载它们。这应该让您回到 2 个查询。
关于php - Symfony 和 Doctrine 中对数据库的查询过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8817839/