2011-04-17 16 views
1

У меня есть три таблицы, такие как пользователь, задание и job_applied. таблица пользователя имеет uid, таблица работы имеет jid, а job_applied имеет uid и jid. Мне нужно получить название работы, описание, положение таблицы заданий в соответствии с uid и jid из таблицы job_applied. Я могу получить значения из кода ниже, но я думаю, что это неправильный путь (грубый путь).Symfony Propel model layer

$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 версия am using ... propel i dont know, какая версия это ... – Darshan

+0

Symfony 1.16 не существует, вы имеете в виду 1.0.16? –

ответ

1

Если текущий пользователь подал заявку на 10 рабочих мест, вы в настоящее время сделать 10 + 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 столом, присоединиться к нему с job_applied таблицы и установите uid в job_applied таблице текущего идентификатора пользователя. Это должно выполнить только один запрос.

$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(); 
} 
Смежные вопросы