php - Symfony 和 Doctrine 中对数据库的查询过多

标签 php mysql symfony1 doctrine symfony-1.4

架构.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/

相关文章:

mysql - 截断mysql数据库中的所有表

mysql - Passenger Nginx 如何处理并发请求

php - Symfony 和 Doctrine 选择查询无法正常工作

javascript - 使用 EventClick 完整日历返回数据

javascript - 单击特定按钮时如何显示特定值

mysql - 在MySql中,定义存储过程时如何使用 'REPLACE'函数?由于引号,查询无法执行

php - 如何从 doctrine/symfony 中设置 MysQL 变量(time_zone)?

database - Symfony 1.4 在保存之前根据数据库条目检查表单值

php - 在 php 变量中存储换行符

php - Javascript 跨域 RSS 提要解析的代理问题