2012-01-11 90 views
3

的schema.yml数据库:太多的查询来Symfony和学说

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查询数据库!这太多了!有可能减少这个?

+0

渴望取? – Hannes 2012-01-11 10:40:13

回答

4

您目前在“懒加载”JobeetCategory对象。如果你知道你将不得不做很多次,这是低效的。你应该做的初始查询联接:

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

这意味着所有相关JobeetCategory对象将从数据库中检索和水合直线距离,所以你不必以后懒加载它们。这应该让你回到2个查询。