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

Sho*_*lis 4 php mysql doctrine symfony1 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 }
Run Code Online (Sandbox Code Playgroud)

动作.类:

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

和模板:

<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>
Run Code Online (Sandbox Code Playgroud)

这些模板仅生成 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>
Run Code Online (Sandbox Code Playgroud)

我在数据库中有 100 个 JobeetJob,然后生成了 102 个数据库查询!这太多了!可以减少这个吗?

lon*_*day 5

您当前正在“延迟加载”JobeetCategory对象。如果您知道必须多次执行此操作,则效率很低。您应该对初始查询进行联接:

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

这意味着将从数据库中检索所有相关的 JobeetCategory 对象并立即进行水化,因此您不必稍后延迟加载它们。这应该会让您减少到 2 个查询。