public static function create(\ModelCriteria $q, $relation, $relationAlias = null, $joinType = \Criteria::INNER_JOIN) { $tableMap = $q->getTableMap(); $relationMap = $tableMap->getRelation($relation); // create a Join object for this join $join = new static(); $join->setJoinType($joinType); $join->setRelationMap($relationMap, $q->getModelAlias(), $relationAlias); if ($previousJoin = $q->getPreviousJoin()) { $join->setPreviousJoin($previousJoin); } // add the ModelJoin to the current object if ($relationAlias) { $q->addAlias($relationAlias, $relationMap->getRightTable()->getName()); $q->addJoinObject($join, $relationAlias); } else { $q->addJoinObject($join, $relationMap->getRightTable()->getName()); } return $join; }
public function testUseQueryJoinWithFind() { $c = new ModelCriteria('bookstore', 'Review'); $c->joinWith('Book'); $c2 = $c->useQuery('Book'); $joins = $c->getJoins(); $this->assertEquals($c->getPreviousJoin(), null, 'The default value for previousJoin remains null'); $this->assertEquals($c2->getPreviousJoin(), $joins['Book'], 'useQuery() sets the previousJoin'); // join Book with Author, which is possible since previousJoin is set, which makes resolving of relations possible during hydration $c2->joinWith('Author'); $c = $c2->endUse(); $con = Propel::getConnection(BookPeer::DATABASE_NAME); $c->find($con); $expectedSQL = "SELECT review.ID, review.REVIEWED_BY, review.REVIEW_DATE, review.RECOMMENDED, review.STATUS, review.BOOK_ID, book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID, author.ID, author.FIRST_NAME, author.LAST_NAME, author.EMAIL, author.AGE FROM `review` INNER JOIN `book` ON (review.BOOK_ID=book.ID) INNER JOIN `author` ON (book.AUTHOR_ID=author.ID)"; $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'useQuery() and joinWith() can be used together and form a correct query'); }
public function testUseQueryJoinWithFind() { $c = new ModelCriteria('bookstore', 'Review'); $c->joinWith('Book'); $c2 = $c->useQuery('Book'); $joins = $c->getJoins(); $this->assertEquals($c->getPreviousJoin(), null, 'The default value for previousJoin remains null'); $this->assertEquals($c2->getPreviousJoin(), $joins['Book'], 'useQuery() sets the previousJoin'); // join Book with Author, which is possible since previousJoin is set, which makes resolving of relations possible during hydration $c2->joinWith('Author'); $c = $c2->endUse(); $con = Propel::getConnection(BookPeer::DATABASE_NAME); $c->find($con); $expectedSQL = "SELECT review.id, review.reviewed_by, review.review_date, review.recommended, review.status, review.book_id, book.id, book.title, book.isbn, book.price, book.publisher_id, book.author_id, author.id, author.first_name, author.last_name, author.email, author.age FROM `review` INNER JOIN `book` ON (review.book_id=book.id) INNER JOIN `author` ON (book.author_id=author.id)"; $this->assertEquals($expectedSQL, $con->getLastExecutedQuery(), 'useQuery() and joinWith() can be used together and form a correct query'); }