1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
<?php
declare(strict_types=1);
namespace Doctrine\Tests\ORM\Functional;
use Doctrine\Tests\Models\StockExchange\Bond;
use Doctrine\Tests\Models\StockExchange\Market;
use Doctrine\Tests\Models\StockExchange\Stock;
use Doctrine\Tests\OrmFunctionalTestCase;
use PHPUnit\Framework\Attributes\Group;
use function assert;
#[Group('DDC-250')]
class IndexByAssociationTest extends OrmFunctionalTestCase
{
private Market|null $market = null;
private Bond|null $bond = null;
protected function setUp(): void
{
$this->useModelSet('stockexchange');
parent::setUp();
$this->loadFixture();
}
public function loadFixture(): void
{
$this->market = new Market('Some Exchange');
$stock1 = new Stock('AAPL', 10, $this->market);
$stock2 = new Stock('GOOG', 20, $this->market);
$this->bond = new Bond('MyBond');
$this->bond->addStock($stock1);
$this->bond->addStock($stock2);
$this->_em->persist($this->market);
$this->_em->persist($stock1);
$this->_em->persist($stock2);
$this->_em->persist($this->bond);
$this->_em->flush();
$this->_em->clear();
}
public function testManyToOneFinder(): void
{
$market = $this->_em->find(Market::class, $this->market->getId());
assert($market instanceof Market);
self::assertCount(2, $market->stocks);
self::assertTrue(isset($market->stocks['AAPL']), 'AAPL symbol has to be key in indexed association.');
self::assertTrue(isset($market->stocks['GOOG']), 'GOOG symbol has to be key in indexed association.');
self::assertEquals('AAPL', $market->stocks['AAPL']->getSymbol());
self::assertEquals('GOOG', $market->stocks['GOOG']->getSymbol());
}
public function testManyToOneDQL(): void
{
$dql = 'SELECT m, s FROM Doctrine\Tests\Models\StockExchange\Market m JOIN m.stocks s WHERE m.id = ?1';
$market = $this->_em->createQuery($dql)->setParameter(1, $this->market->getId())->getSingleResult();
self::assertCount(2, $market->stocks);
self::assertTrue(isset($market->stocks['AAPL']), 'AAPL symbol has to be key in indexed association.');
self::assertTrue(isset($market->stocks['GOOG']), 'GOOG symbol has to be key in indexed association.');
self::assertEquals('AAPL', $market->stocks['AAPL']->getSymbol());
self::assertEquals('GOOG', $market->stocks['GOOG']->getSymbol());
}
public function testManyToMany(): void
{
$bond = $this->_em->find(Bond::class, $this->bond->getId());
self::assertCount(2, $bond->stocks);
self::assertTrue(isset($bond->stocks['AAPL']), 'AAPL symbol has to be key in indexed association.');
self::assertTrue(isset($bond->stocks['GOOG']), 'GOOG symbol has to be key in indexed association.');
self::assertEquals('AAPL', $bond->stocks['AAPL']->getSymbol());
self::assertEquals('GOOG', $bond->stocks['GOOG']->getSymbol());
}
public function testManytoManyDQL(): void
{
$dql = 'SELECT b, s FROM Doctrine\Tests\Models\StockExchange\Bond b JOIN b.stocks s WHERE b.id = ?1';
$bond = $this->_em->createQuery($dql)->setParameter(1, $this->bond->getId())->getSingleResult();
self::assertCount(2, $bond->stocks);
self::assertTrue(isset($bond->stocks['AAPL']), 'AAPL symbol has to be key in indexed association.');
self::assertTrue(isset($bond->stocks['GOOG']), 'GOOG symbol has to be key in indexed association.');
self::assertEquals('AAPL', $bond->stocks['AAPL']->getSymbol());
self::assertEquals('GOOG', $bond->stocks['GOOG']->getSymbol());
}
public function testDqlOverrideIndexBy(): void
{
$dql = 'SELECT b, s FROM Doctrine\Tests\Models\StockExchange\Bond b JOIN b.stocks s INDEX BY s.id WHERE b.id = ?1';
$bond = $this->_em->createQuery($dql)->setParameter(1, $this->bond->getId())->getSingleResult();
self::assertCount(2, $bond->stocks);
self::assertFalse(isset($bond->stocks['AAPL']), 'AAPL symbol not exists in re-indexed association.');
self::assertFalse(isset($bond->stocks['GOOG']), 'GOOG symbol not exists in re-indexed association.');
}
}
|