Критерии Symfony Присоединяйтесь к неожиданному поведению - PullRequest
0 голосов
/ 12 декабря 2011

Я пытаюсь выполнить сложный запрос с критериями в проекте Symfony, используя Propel ORM.

запрос, который я хочу сделать, в человеческих словах:

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, SQL корректен, когда я также отправляю значение $ apo. Но когда я отправляю оба, только $ apo AND появляется в SQL.

Полагаю, это потому, что вызов $ c-> add (...) такой же, с отдельным параметром, но не совсем уверен. Это ошибка? Каков наилучший способ правильно сформировать мой запрос?

Большое спасибо за ваше время! : D

1 Ответ

0 голосов
/ 13 декабря 2011

Да, он отменяет предыдущий вызов, так как объект Criteria хранит только одно условие на поле.Решение состоит в том, чтобы создать 2 или более отдельных объекта 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, инесколько ограничений на одно и то же поле не перекрывают друг друга.

Надеюсь, это поможет, Даниэль

...