2012-01-11 17 views
3

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->getJobeetCategory()->getName() ?></td> 
     <td><?php echo $jobeet_job->getName() ?></td> 
    </tr> 
    <?php endforeach; ?> 
</table> 

と私はデータベース100 JobeetJobに、これはデータベースに102クエリを生成しています!これはあまりにも多いです!これを減らすことは可能ですか?

+0

eager fetching? – Hannes

答えて

4

現在、JobeetCategoryオブジェクトを「遅延読み込み」しています。これは、あなたがそれを何度もやらなければならないことを知っていれば、非効率的です。あなたは、最初のクエリに参加する実行する必要があります。

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

これは、関連するすべてのJobeetCategoryオブジェクトは、データベースから取得し、水和すぐに、あなたがする必要はありませんので、後でそれらをレイジーロードされることを意味します。これにより、2つのクエリに戻ることができます。

関連する問題