2011-04-17 71 views
1

我有三個表,如用戶,工作和job_applied。用戶表有uid,工作表有jid,job_applied有uid和jid。我需要根據job_applied表的uid和jid來獲得工作表的名稱,說明,工作表的位置。 我可以從下面的代碼中獲取值,但我認爲這是錯誤的方式(粗糙的方式)。Symfony推進模型圖層

$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? – 2011-04-17 11:22:14

+0

symfony 1.16版本正在使用...推動我不知道,它是哪個版本... – Darshan 2011-04-18 05:14:53

+0

Symfony 1.16不存在,你的意思是1.0.16? – 2011-04-18 08:27:34

回答

1

如果當前用戶已經申請了10個就業機會,你現在做10個+ 1查詢(一個讓所有應用程序,然後每個作業之一)。您可以通過兩種方式來改善此問題:您可以首先收集數組中的所有jid值,然後執行IN查詢,以便執行1 + 1查詢,而不是在循環中執行10個查詢。

$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表,用job_applied表加入,並設置job_applied表的uid到您當前的用戶ID。這應該只執行一個查詢。

$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(); 
}