123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- <?php
- namespace Doctrine\Tests\ORM\Functional\Ticket;
- use DateTime;
- require_once __DIR__ . '/../../../TestInit.php';
- /**
- * @group DDC-618
- */
- class DDC618Test extends \Doctrine\Tests\OrmFunctionalTestCase
- {
- protected function setUp()
- {
- parent::setUp();
- try {
- $this->_schemaTool->createSchema(array(
- $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC618Author'),
- $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC618Book')
- ));
- // Create author 10/Joe with two books 22/JoeA and 20/JoeB
- $author = new DDC618Author();
- $author->id = 10;
- $author->name = 'Joe';
- $this->_em->persist($author);
- // Create author 11/Alice with two books 21/AliceA and 23/AliceB
- $author = new DDC618Author();
- $author->id = 11;
- $author->name = 'Alice';
- $author->addBook('In Wonderland');
- $author->addBook('Reloaded');
- $author->addBook('Test');
- $this->_em->persist($author);
- $this->_em->flush();
- $this->_em->clear();
- } catch(\Exception $e) {
- }
- }
- public function testIndexByHydrateObject()
- {
- $dql = 'SELECT A FROM Doctrine\Tests\ORM\Functional\Ticket\DDC618Author A INDEX BY A.name ORDER BY A.name ASC';
- $result = $this->_em->createQuery($dql)->getResult(\Doctrine\ORM\Query::HYDRATE_OBJECT);
- $joe = $this->_em->find('Doctrine\Tests\ORM\Functional\Ticket\DDC618Author', 10);
- $alice = $this->_em->find('Doctrine\Tests\ORM\Functional\Ticket\DDC618Author', 11);
- $this->assertArrayHasKey('Joe', $result, "INDEX BY A.name should return an index by the name of 'Joe'.");
- $this->assertArrayHasKey('Alice', $result, "INDEX BY A.name should return an index by the name of 'Alice'.");
- }
- public function testIndexByHydrateArray()
- {
- $dql = 'SELECT A FROM Doctrine\Tests\ORM\Functional\Ticket\DDC618Author A INDEX BY A.name ORDER BY A.name ASC';
- $result = $this->_em->createQuery($dql)->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
- $joe = $this->_em->find('Doctrine\Tests\ORM\Functional\Ticket\DDC618Author', 10);
- $alice = $this->_em->find('Doctrine\Tests\ORM\Functional\Ticket\DDC618Author', 11);
- $this->assertArrayHasKey('Joe', $result, "INDEX BY A.name should return an index by the name of 'Joe'.");
- $this->assertArrayHasKey('Alice', $result, "INDEX BY A.name should return an index by the name of 'Alice'.");
- }
- /**
- * @group DDC-1018
- */
- public function testIndexByJoin()
- {
- $dql = 'SELECT A, B FROM Doctrine\Tests\ORM\Functional\Ticket\DDC618Author A '.
- 'INNER JOIN A.books B INDEX BY B.title ORDER BY A.name ASC';
- $result = $this->_em->createQuery($dql)->getResult(\Doctrine\ORM\Query::HYDRATE_OBJECT);
- $this->assertEquals(3, count($result[0]->books)); // Alice, Joe doesnt appear because he has no books.
- $this->assertEquals('Alice', $result[0]->name);
- $this->assertTrue( isset($result[0]->books["In Wonderland"] ), "Indexing by title should have books by title.");
- $this->assertTrue( isset($result[0]->books["Reloaded"] ), "Indexing by title should have books by title.");
- $this->assertTrue( isset($result[0]->books["Test"] ), "Indexing by title should have books by title.");
- $result = $this->_em->createQuery($dql)->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
- $this->assertEquals(3, count($result[0]['books'])); // Alice, Joe doesnt appear because he has no books.
- $this->assertEquals('Alice', $result[0]['name']);
- $this->assertTrue( isset($result[0]['books']["In Wonderland"] ), "Indexing by title should have books by title.");
- $this->assertTrue( isset($result[0]['books']["Reloaded"] ), "Indexing by title should have books by title.");
- $this->assertTrue( isset($result[0]['books']["Test"] ), "Indexing by title should have books by title.");
- }
- /**
- * @group DDC-1018
- */
- public function testIndexByToOneJoinSilentlyIgnored()
- {
- $dql = 'SELECT B, A FROM Doctrine\Tests\ORM\Functional\Ticket\DDC618Book B '.
- 'INNER JOIN B.author A INDEX BY A.name ORDER BY A.name ASC';
- $result = $this->_em->createQuery($dql)->getResult(\Doctrine\ORM\Query::HYDRATE_OBJECT);
- $this->assertInstanceOf('Doctrine\Tests\ORM\Functional\Ticket\DDC618Book', $result[0]);
- $this->assertInstanceOf('Doctrine\Tests\ORM\Functional\Ticket\DDC618Author', $result[0]->author);
- $dql = 'SELECT B, A FROM Doctrine\Tests\ORM\Functional\Ticket\DDC618Book B '.
- 'INNER JOIN B.author A INDEX BY A.name ORDER BY A.name ASC';
- $result = $this->_em->createQuery($dql)->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
- $this->assertEquals("Alice", $result[0]['author']['name']);
- }
- /**
- * @group DDC-1018
- */
- public function testCombineIndexBy()
- {
- $dql = 'SELECT A, B FROM Doctrine\Tests\ORM\Functional\Ticket\DDC618Author A INDEX BY A.id '.
- 'INNER JOIN A.books B INDEX BY B.title ORDER BY A.name ASC';
- $result = $this->_em->createQuery($dql)->getResult(\Doctrine\ORM\Query::HYDRATE_OBJECT);
- $this->assertArrayHasKey(11, $result); // Alice
- $this->assertEquals(3, count($result[11]->books)); // Alice, Joe doesnt appear because he has no books.
- $this->assertEquals('Alice', $result[11]->name);
- $this->assertTrue( isset($result[11]->books["In Wonderland"] ), "Indexing by title should have books by title.");
- $this->assertTrue( isset($result[11]->books["Reloaded"] ), "Indexing by title should have books by title.");
- $this->assertTrue( isset($result[11]->books["Test"] ), "Indexing by title should have books by title.");
- }
- }
- /**
- * @Entity
- */
- class DDC618Author
- {
- /**
- * @Id
- * @Column(type="integer")
- */
- public $id;
- /** @Column(type="string") */
- public $name;
- /**
- * @OneToMany(targetEntity="DDC618Book", mappedBy="author", cascade={"persist"})
- */
- public $books;
- public function __construct()
- {
- $this->books = new \Doctrine\Common\Collections\ArrayCollection;
- }
- public function addBook($title)
- {
- $book = new DDC618Book($title, $this);
- $this->books[] = $book;
- }
- }
- /**
- * @Entity
- */
- class DDC618Book
- {
- /**
- * @Id @GeneratedValue
- * @Column(type="integer")
- */
- public $id;
- /** @column(type="string") */
- public $title;
- /** @ManyToOne(targetEntity="DDC618Author", inversedBy="books") */
- public $author;
- function __construct($title, $author)
- {
- $this->title = $title;
- $this->author = $author;
- }
- }
|