php – 在Symfony和Doctrine中对数据库的查询太多

的schema.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.class:

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中对数据库的查询太多 - 代码日志