Symfony Propel模型层

时间:2011-04-17 06:35:02

标签: php symfony1 model propel

我有三个表,例如user,job和job_applied。用户表有uid,作业表有jid,job_applied有uid和jid。我需要根据job_applied表的uid和jid得到职位,描述,职位表的位置。 我可以从下面的代码中获取值,但我认为这是错误的方法(粗略的方式)。

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

}

1 个答案:

答案 0 :(得分:1)

如果当前用户申请了10个作业,您当前会执行10 + 1个查询(一个用于获取所有应用程序,然后是每个作业一个)。您可以通过两种方式改进这一点:

您可以先在数组中收集所有jid值,然后执行IN查询,而不是在循环中执行10次查询,这样就可以进行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到您当前的用户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();
}