Твърде много заявки към база данни в 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 заявка към базата данни! Това е твърде много! Възможно ли е да се намали това?


person Shon Nocolis    schedule 11.01.2012    source източник


Отговори (1)


В момента зареждате JobeetCategory обектите „мързеливо“. Това е неефективно, ако знаете, че ще трябва да го правите много пъти. Трябва да направите присъединяване към първоначалната заявка:

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

Това означава, че всички съответни JobeetCategory обекти ще бъдат извлечени от базата данни и незабавно хидратирани, така че не е нужно да ги зареждате по-късно. Това трябва да ви върне обратно към 2 заявки.

person lonesomeday    schedule 11.01.2012