Commit 30d1b54d authored by beberlei's avatar beberlei

[2.0] DDC-337 - Collections that are fetched through StandardEntityPersister...

[2.0] DDC-337 - Collections that are fetched through StandardEntityPersister and ordered are sorted by any given ORDER BY snippet. Now only the DQL Parser is missing in this regard.
parent ab3a6cc1
...@@ -135,6 +135,6 @@ class OneToManyMapping extends AssociationMapping ...@@ -135,6 +135,6 @@ class OneToManyMapping extends AssociationMapping
} }
} }
$persister->loadOneToManyCollection($conditions, $targetCollection); $persister->loadOneToManyCollection($this, $conditions, $targetCollection);
} }
} }
...@@ -540,14 +540,20 @@ class StandardEntityPersister ...@@ -540,14 +540,20 @@ class StandardEntityPersister
/** /**
* Loads a collection of entities in a one-to-many association. * Loads a collection of entities in a one-to-many association.
* *
* @param OneToManyMapping $assoc
* @param array $criteria The criteria by which to select the entities. * @param array $criteria The criteria by which to select the entities.
* @param PersistentCollection The collection to fill. * @param PersistentCollection The collection to fill.
*/ */
public function loadOneToManyCollection(array $criteria, PersistentCollection $coll) public function loadOneToManyCollection($assoc, array $criteria, PersistentCollection $coll)
{ {
$owningAssoc = $this->_class->associationMappings[$coll->getMapping()->mappedByFieldName]; $owningAssoc = $this->_class->associationMappings[$coll->getMapping()->mappedByFieldName];
$sql = $this->_getSelectEntitiesSql($criteria, $owningAssoc); $sql = $this->_getSelectEntitiesSql($criteria, $owningAssoc);
if ($assoc->orderBy !== null) {
$sql .= ' ORDER BY '.str_replace('%alias%', $this->_class->getTableName(), $assoc->orderBy);
}
$params = array_values($criteria); $params = array_values($criteria);
if ($this->_sqlLogger !== null) { if ($this->_sqlLogger !== null) {
...@@ -565,6 +571,7 @@ class StandardEntityPersister ...@@ -565,6 +571,7 @@ class StandardEntityPersister
/** /**
* Loads a collection of entities of a many-to-many association. * Loads a collection of entities of a many-to-many association.
* *
* @param ManyToManyMapping $assoc
* @param array $criteria * @param array $criteria
* @param PersistentCollection $coll The collection to fill. * @param PersistentCollection $coll The collection to fill.
*/ */
...@@ -716,7 +723,8 @@ class StandardEntityPersister ...@@ -716,7 +723,8 @@ class StandardEntityPersister
/** /**
* Gets the SQL to select a collection of entities in a many-many association. * Gets the SQL to select a collection of entities in a many-many association.
* *
* @param ManyToManyMapping $assoc
* @param array $criteria * @param array $criteria
* @return string * @return string
*/ */
...@@ -750,11 +758,16 @@ class StandardEntityPersister ...@@ -750,11 +758,16 @@ class StandardEntityPersister
$columnName = $joinTableName . '.' . $owningAssoc->getQuotedJoinColumnName($joinColumn, $this->_platform); $columnName = $joinTableName . '.' . $owningAssoc->getQuotedJoinColumnName($joinColumn, $this->_platform);
$conditionSql .= $columnName . ' = ?'; $conditionSql .= $columnName . ' = ?';
} }
$orderBySql = '';
if ($manyToMany->orderBy !== null) {
$orderBySql = ' ORDER BY '.str_replace('%alias%', $this->_class->getTableName(), $manyToMany->orderBy);
}
return 'SELECT ' . $this->_getSelectColumnList() return 'SELECT ' . $this->_getSelectColumnList()
. ' FROM ' . $this->_class->getQuotedTableName($this->_platform) . ' FROM ' . $this->_class->getQuotedTableName($this->_platform)
. $joinSql . $joinSql
. ' WHERE ' . $conditionSql; . ' WHERE ' . $conditionSql . $orderBySql;
} }
/** @override */ /** @override */
......
...@@ -18,4 +18,9 @@ class RoutingLocation ...@@ -18,4 +18,9 @@ class RoutingLocation
* @Column(type="string") * @Column(type="string")
*/ */
public $name; public $name;
public function getName()
{
return $this->name;
}
} }
\ No newline at end of file
...@@ -17,14 +17,21 @@ class RoutingRoute ...@@ -17,14 +17,21 @@ class RoutingRoute
public $id; public $id;
/** /**
* @ManyToMany(targetEntity="Doctrine\Tests\Models\Routing\RoutingLeg", cascade={"all"}) * @ManyToMany(targetEntity="RoutingLeg", cascade={"all"})
* @JoinTable(name="RoutingRouteLegs", * @JoinTable(name="RoutingRouteLegs",
* joinColumns={@JoinColumn(name="route_id", referencedColumnName="id")}, * joinColumns={@JoinColumn(name="route_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="leg_id", referencedColumnName="id", unique=true)} * inverseJoinColumns={@JoinColumn(name="leg_id", referencedColumnName="id", unique=true)}
* ) * )
* @OrderBy("%alias%.departureDate ASC")
*/ */
public $legs; public $legs;
/**
* @OneToMany(targetEntity="RoutingRouteBooking", mappedBy="route")
* @OrderBy("%alias%.passengerName ASC")
*/
public $bookings = array();
public function __construct() public function __construct()
{ {
$this->legs = new ArrayCollection(); $this->legs = new ArrayCollection();
......
<?php
namespace Doctrine\Tests\Models\Routing;
/**
* @Entity
*/
class RoutingRouteBooking
{
/**
* @Id
* @Column(type="integer")
* @generatedValue(strategy="AUTO")
*/
public $id;
/**
* @ManyToOne(targetEntity="RoutingRoute")
* @JoinColumn(name="route_id", referencedColumnName="id")
*/
public $route;
/**
* @Column(type="string")
*/
public $passengerName = null;
public function getPassengerName()
{
return $this->passengerName;
}
}
\ No newline at end of file
<?php
namespace Doctrine\Tests\ORM\Functional;
use Doctrine\Tests\Models\Routing\RoutingRoute;
use Doctrine\Tests\Models\Routing\RoutingLocation;
use Doctrine\Tests\Models\Routing\RoutingLeg;
use Doctrine\Tests\Models\Routing\RoutingRouteBooking;
require_once __DIR__ . '/../../TestInit.php';
class OrderedAssociationTest extends \Doctrine\Tests\OrmFunctionalTestCase
{
protected $locations = array();
public function setUp()
{
$this->useModelSet('routing');
parent::setUp();
$locations = array("Berlin", "Bonn", "Brasilia", "Atlanta");
foreach ($locations AS $locationName) {
$location = new RoutingLocation();
$location->name = $locationName;
$this->_em->persist($location);
$this->locations[$locationName] = $location;
}
$this->_em->flush();
}
public function testLazyManyToManyCollection_IsRetrievedWithOrderByClause()
{
$route = new RoutingRoute();
$leg1 = new RoutingLeg();
$leg1->fromLocation = $this->locations['Berlin'];
$leg1->toLocation = $this->locations['Bonn'];
$leg1->departureDate = new \DateTime("now");
$leg1->arrivalDate = new \DateTime("now +5 hours");
$leg2 = new RoutingLeg();
$leg2->fromLocation = $this->locations['Bonn'];
$leg2->toLocation = $this->locations['Brasilia'];
$leg2->departureDate = new \DateTime("now +6 hours");
$leg2->arrivalDate = new \DateTime("now +24 hours");
$route->legs[] = $leg2;
$route->legs[] = $leg1;
$this->_em->persist($route);
$this->_em->flush();
$routeId = $route->id;
$this->_em->clear();
$route = $this->_em->find('Doctrine\Tests\Models\Routing\RoutingRoute', $routeId);
$this->assertEquals(2, count($route->legs));
$this->assertEquals("Berlin", $route->legs[0]->fromLocation->getName());
$this->assertEquals("Bonn", $route->legs[1]->fromLocation->getName());
}
public function testLazyOneToManyCollection_IsRetrievedWithOrderByClause()
{
$route = new RoutingRoute();
$this->_em->persist($route);
$this->_em->flush();
$routeId = $route->id;
$booking1 = new RoutingRouteBooking();
$booking1->passengerName = "Guilherme";
$booking2 = new RoutingRouteBooking();
$booking2->passengerName = "Benjamin";
$route->bookings[] = $booking1;
$booking1->route = $route;
$route->bookings[] = $booking2;
$booking2->route = $route;
$this->_em->persist($booking1);
$this->_em->persist($booking2);
$this->_em->flush();
$this->_em->clear();
$route = $this->_em->find('Doctrine\Tests\Models\Routing\RoutingRoute', $routeId);
$this->assertEquals(2, count($route->bookings));
$this->assertEquals('Benjamin', $route->bookings[0]->getPassengerName());
$this->assertEquals('Guilherme', $route->bookings[1]->getPassengerName());
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment