2012-03-16 61 views
4

教义,我可以:行走和leftJoin

$q = Doctrine_Query::create() 
     ->from('One o') 
     ->where('t.text = ?', 'aaa') 
     ->andWhere('h.text = ?', 'bbb') 
     ->leftJoin('o.Two t') 
     ->leftJoin('t.Three h') 
     ->leftJoin('h.Four f') 
     ->execute(); 

如何从Symfony的1使这个在行走?

回答

6

如果使用前1.6推动,你必须遵循

你必须知道每个关系的主键。 如果是id,也可以是类似的东西:

$c = new Criteria(); 

$c->add(TwoPeer::TEXT, 'aaa'); 
$c->add(ThreePeer::TEXT, 'bbb'); 

$c->addJoin(OnePeer::TWO_ID, TwoPeer::ID, Criteria::LEFT_JOIN); 
$c->addJoin(TwoPeer::THREE_ID, ThreePeer::ID, Criteria::LEFT_JOIN); 
$c->addJoin(ThreePeer::FOUR_ID, FourPeer::ID, Criteria::LEFT_JOIN); 

$results = OnePeer::doSelect($c); 

对于行走1.6(从https://github.com/propelorm/sfPropelORMPlugin使用它),这样的事情:

$results = OneQuery::create() 
    ->useTwoQuery() 
    ->filterByText('aaa') 
    ->useThreeQuery() 
     ->filterByText('bbb') 
    ->endUse() 
    ->endUse() 
    ->leftJoinWith('Three.Four') 
    ->find(); 
3

关于j0k答案,更容易方式是:

$results = OneQuery::create() 
    ->useTwoQuery(null, Criteria::LEFT_JOIN) 
     ->filterByText('aaa') 
     ->useThreeQuery(null, Criteria::LEFT_JOIN) 
     ->filterByText('bbb') 
     ->endUse() 
    ->endUse() 
->find();