[2.0] DDC-176 - Disallow iterate() over fetch-join collections by the means of an exception on parsing the DQL query.
This commit is contained in:
parent
03bc9350dc
commit
3e823f065a
@ -77,6 +77,11 @@ final class Query extends AbstractQuery
|
||||
const HINT_CUSTOM_TREE_WALKERS = 'doctrine.customTreeWalkers';
|
||||
//const HINT_READ_ONLY = 'doctrine.readOnly';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
const HINT_INTERNAL_ITERATION = 'doctrine.internal.iteration';
|
||||
|
||||
/**
|
||||
* @var integer $_state The current state of this query.
|
||||
*/
|
||||
@ -419,4 +424,18 @@ final class Query extends AbstractQuery
|
||||
{
|
||||
return $this->_maxResults;
|
||||
}
|
||||
|
||||
/**
|
||||
* Executes the query and returns an IterableResult that can be used to incrementally
|
||||
* iterated over the result.
|
||||
*
|
||||
* @param array $params The query parameters.
|
||||
* @param integer $hydrationMode The hydration mode to use.
|
||||
* @return IterableResult
|
||||
*/
|
||||
public function iterate(array $params = array(), $hydrationMode = self::HYDRATE_OBJECT)
|
||||
{
|
||||
$this->setHint(self::HINT_INTERNAL_ITERATION, true);
|
||||
return parent::iterate($params, $hydrationMode);
|
||||
}
|
||||
}
|
@ -63,4 +63,15 @@ class QueryException extends \Doctrine\Common\DoctrineException
|
||||
{
|
||||
return new self("Invalid parameter: token ".$key." is not defined in the query.");
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Doctrine\ORM\Mapping\AssociationMapping $assoc
|
||||
*/
|
||||
public static function iterateWithFetchJoinCollectionNotAllowed($assoc)
|
||||
{
|
||||
return new self(
|
||||
"Invalid query operation: Not allowed to iterate over fetch join collections ".
|
||||
"in class ".$assoc->sourceEntityName." assocation ".$assoc->sourceFieldName
|
||||
);
|
||||
}
|
||||
}
|
@ -55,8 +55,11 @@ class SqlWalker implements TreeWalker
|
||||
/** The Connection of the EntityManager. */
|
||||
private $_conn;
|
||||
|
||||
/** The Query instance. */
|
||||
/**
|
||||
* @var AbstractQuery
|
||||
*/
|
||||
private $_query;
|
||||
|
||||
private $_dqlToSqlAliasMap = array();
|
||||
|
||||
/** Map from result variable names to their SQL column alias names. */
|
||||
@ -650,6 +653,12 @@ class SqlWalker implements TreeWalker
|
||||
$assoc = $relation;
|
||||
}
|
||||
|
||||
if ($this->_query->getHint(Query::HINT_INTERNAL_ITERATION) == true) {
|
||||
if ($relation->isOneToMany() || $relation->isManyToMany()) {
|
||||
throw QueryException::iterateWithFetchJoinNotAllowed($assoc);
|
||||
}
|
||||
}
|
||||
|
||||
if ($assoc->isOneToOne()) {
|
||||
$sql .= $targetTableName . ' ' . $targetTableAlias . ' ON ';
|
||||
$first = true;
|
||||
|
@ -176,6 +176,15 @@ class QueryTest extends \Doctrine\Tests\OrmFunctionalTestCase
|
||||
$this->_em->clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Doctrine\ORM\Query\QueryException
|
||||
*/
|
||||
public function testIterateResult_FetchJoinedCollection_ThrowsException()
|
||||
{
|
||||
$query = $this->_em->createQuery("SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.articles a");
|
||||
$articles = $query->iterate();
|
||||
}
|
||||
|
||||
public function testFluentQueryInterface()
|
||||
{
|
||||
$q = $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a");
|
||||
|
Loading…
x
Reference in New Issue
Block a user