1
0
mirror of synced 2024-12-16 16:16:04 +03:00
doctrine2/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC618Test.php
2011-12-19 22:56:19 +01:00

185 lines
6.7 KiB
PHP

<?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;
}
}