Бывают ситуации, когда нужно получить запрос c оператором Left Join указав несколько условных выражений. Например:
SELECT * FROM news LEFT JOIN news_type ON news.type_id = news_type.id AND YEAR(news.published_at) = YEAR(NOW()) WHERE news.is_published = 1 AND ... LIMIT 10
Используя стандартную конструкцию Propel Criteria, получаем следующий код:
$c = new Criteria(); $c->add(NewsPeer::IS_PUBLISHED, true); $c->addJoin(NewsPeer::TYPE_ID, NewsTypePeer::ID, Criteria::LEFT_JOIN); $c->add(NewsPeer::DATE, "YEAR(" . NewsPeer::PUBLISHED_AT. ") = YEAR(NOW())", Criteria::CUSTOM); ....
Но результат не будет соответствовать нашему условию и это можно увидеть в сгененированном SQL-коде:
SELECT * FROM news LEFT JOIN news_type ON news.type_id = news_type.id WHERE news.is_published = 1 AND YEAR(news.published_at) = YEAR(NOW()) ... LIMIT 10
В Propel 1.3 появилась возможность указать несколько условий для оператора Join. Правильный код будет таков:
$c = new Criteria(); $c->add(NewsPeer::IS_PUBLISHED, true); $c->addJoin( array(NewsPeer::TYPE_ID, "YEAR(" . NewsPeer::PUBLISHED_AT. ")"), array(NewsTypePeer::ID, "YEAR(NOW())"), Criteria::LEFT_JOIN ); ....
Источник: Propel 1.3:: More on Criteria:: Joins