2011-04-17 12 views
1

私はuser、job、job_appliedの3つのテーブルを持っています。ユーザーテーブルにはuidがあり、ジョブテーブルにはjidがあり、job_appliedにはuidとjidがあります。私はjob_appliedテーブルのuidとjidに応じて、仕事のタイトル、説明、仕事のテーブルの位置を取得する必要があります。 私は下のコードから値を取得することができますが、これは間違った方法(粗い方法)だと思います。symfony Propelモデル層

$this->jobapplieds = $this->getUser()->getUser()->getJobApplieds(); 

foreach($jobapplieds as $ja) 
{  
    $c = new Criteria(); 

    $c->clearSelectColumns(); 

    $c->addSelectColumn(JobPeer::TITLE); 

    $c->addSelectColumn(JobPeer::DESCRIPTION); 

    $c->addSelectColumn(JobPeer::STATUS); 

    $c->add(JobPeer::JID,$ja->getJid()); 

    $rs = JobPeer::doSelectRS($c); 

    while($rs->next()) 
    { 
     echo $rs->getString(1); 
     print $rs->getString(2); 
    } 

    echo $ja->getAppliedAt(); 

} 
+0

SymfonyとPropelのどちらのバージョンをお使いですか? –

+0

symfony 1.16バージョンを使用しています... propel私は知っていません、どのバージョンですか... – Darshan

+0

symfony 1.16は存在しません、1.0.16を意味しますか? –

答えて

1

現在のユーザーが10個のジョブに適用した場合、あなたは現在、10個の+ 1クエリ(1すべてのアプリケーションと、ジョブごとに1つずつ取得する)を行います。

ループ内で10個のクエリを実行する代わりに、配列内のすべてのjid値を収集してからINクエリを実行すると、1 + 1クエリが実行されます。

$this->jobapplieds = $this->getUser()->getUser()->getJobApplieds(); 
$jobapplieds_by_jid = array(); 
foreach ($jobapplieds as $ja) 
{ 
    // If you can apply multiple times for the same job, this should be a second-level array 
    $jobapplieds_by_jid[$ja->getJid()] = $ja; 
} 

$c = new Criteria(); 
$c->add(JobPeer::JID, array_keys($jobapplieds_by_jid), Criteria::IN); 
$jobs = JobPeer::doSelect($c); 

foreach ($jobs as $job) 
{ 
    echo $job->getTitle(); 
    echo $job->getDescription(); 
    echo $jobapplieds_by_jid[$job->getJid()]->getAppliedAt(); 
} 

他のオプションは、あなたがjobテーブルで始まる1つのクエリを実行job_appliedテーブルとそれに参加し、現在のユーザーIDにjob_appliedテーブルのuidを設定することです。これにより、1つのクエリのみが実行されます。

$c = new Criteria(); 
$c->add(JobAppliedPeer::UID, $this->getUser()->getUser()->getUid()); 
$jobs = JobPeer::doSelectJoinJobApplied($c); 
foreach ($jobs as $job) 
{ 
    echo $job->getTitle(); 
    echo $job->getDescription(); 
    echo $job->getJobApplied()->getAppliedAt(); 
} 
関連する問題