Symfony Criteria加入意外行为

时间:2011-12-12 15:27:27

标签: php sql join symfony1 symfony-1.4

我正在尝试使用Propel ORM在Symfony项目中使用Criteria进行复杂查询。

我想要的查询是,用人类的话来说:

Select from the 'interface' table the registers that: 
- 1 are associated with a process (with a link table)
- 2 have a name similat to $name
- 3 its destiny application's name is $apd (application accecible by foreign key)
- 4 its originapplication's name is $apo (application accecible by foreign key)

这里是我制作的代码,但没有工作:

    $c = new Criteria();
    $c->addJoin($linkPeer::CODIGO_INTERFASE,$intPeer::CODIGO_INTERFASE);       //1
    $c->add($linkPeer::CODIGO_PROCESONEGOCIO,$this->getCodigoProcesonegocio());//1
    if($name){                                                    
        $name = '%'.$name.'%';                                    //2
        $c->add($intPeer::NOMBRE_INTERFASE,$name,Criteria::LIKE); //2
    }
    if($apd){
        $apd = '%'.$apd.'%'; //3
        $c->addJoin($appPeer::CODIGO_APLICACION,$intPeer::CODIGO_APLICACION_DESTINO);//3
        $c->add($appPeer::NOMBRE_APLICACION,$apd,Criteria::LIKE); //3
    }
    if($apo){
        $apo = '%'.$apo.'%';//4
        $c->addJoin($appPeer::CODIGO_APLICACION,$intPeer::CODIGO_APLICACION_ORIGEN);//4
        $c->add($appPeer::NOMBRE_APLICACION,$apo,Criteria::LIKE);//4
    }

之后我做了一个$c->toString()来看看生成的SQL,当我发送$ apd值时,我看到当我只发送$ apd值时,SQL是正确的。但是当我发送两者时,只有$ apo AND在SQL上出现。

我想这是因为$ c-> add(...)调用与一个不同的参数相同,但根本不确定。这是错误吗?正确生成查询的最佳方法是什么?

非常感谢你的时间! :d

1 个答案:

答案 0 :(得分:0)

是的,它覆盖了之前的调用,因为Criteria对象每个字段只存储一个条件。解决方案是创建两个或多个单独的Criterion对象并将它们混合到Criteria对象中:

//something like this
$cron1 = $criteria->getNewCriterion();
$cron1->add($appPeer::NOMBRE_APLICACION,$apo,Criteria::LIKE);//4
$criteria->add($cron);
//and the same with the other criterion

但是,升级到Propel15 +会更容易,你在那里处理Query类级别,并且对同一字段的多个限制不会互相覆盖。

希望这有帮助, 丹尼尔