Слой модели Symfony Propel

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

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

}

person Darshan    schedule 17.04.2011    source источник
comment
Какую версию Symfony и Propel вы используете?   -  person Frosty Z    schedule 17.04.2011
comment
Я использую версию symfony 1.16...пропел, я не знаю, какая это версия...   -  person Darshan    schedule 18.04.2011
comment
Symfony 1.16 не существует, вы имеете в виду 1.0.16?   -  person Jan Fabry    schedule 18.04.2011


Ответы (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();
}
person Jan Fabry    schedule 18.04.2011