1. simple join two tables
purpose:
generate sql like:
select * from photo p
left join artist a on p.artist_id = a.artist_id
where a.genre = 'something' and p.genre = 'something'
code:
if(!CriteriaUtil::hasJoin($criteria, ArtistPeer::TABLE_NAME)){
$criteria->addJoin(PhotoPeer::ARTIST_ID, ArtistPeer::ARTIST_ID, Criteria::LEFT_JOIN);
}
$criteria->add(ArtistPeer::GENRE, $genre);
$criteria->add(PhotoPeer::GENRE, $genre);
2. join two tables, add AND OR between conditions
purpose:
generate sql like:
select * from photo p
left join artist a on p.artist_id = a.artist_id
where (a.genre = 'some' or p.genre='something')
and a.name = 'something'
code:
if(!CriteriaUtil::hasJoin($criteria, ArtistPeer::TABLE_NAME)){
$criteria->addJoin(PhotoPeer::ARTIST_ID, ArtistPeer::ARTIST_ID, Criteria::LEFT_JOIN);
}
$criteria->add(ArtistPeer::GENRE, $genre);
$c = $criteria->getCriterion(ArtistPeer::GENRE);
if($c != null){
$c->addOr($criteria->getNewCriterion(PhotoPeer::GENRE, $genre));
}
$criteria->add(ArtistPeer::NAME, $name);
Note:
It's a good habit to check if we have joined the table already. to check this, you can use the following util class, it get all the joined tables, and check if the table exists in them.
class CriteriaUtil{
public static function hasJoin($c, $table_name){
$joins = $c->getJoins();
if($joins != null){
foreach($joins as $join){
if($join->getRightTableName() == $table_name){
return true;
}
if($join->getLeftTableName() == $table_name){
return true;
}
}
}
return false;
}
}