3 namespace Doctrine\Tests\ORM\Functional;
5 use Doctrine\Tests\Models\ECommerce\ECommerceCart;
6 use Doctrine\Tests\Models\ECommerce\ECommerceProduct;
7 use Doctrine\ORM\Mapping\AssociationMapping;
8 use Doctrine\ORM\Mapping\ClassMetadata;
10 require_once __DIR__ . '/../../TestInit.php';
13 * Tests a unidirectional many-to-many association mapping (without inheritance).
14 * Inverse side is not present.
16 class ManyToManyUnidirectionalAssociationTest extends AbstractManyToManyAssociationTestCase
18 protected $_firstField = 'cart_id';
19 protected $_secondField = 'product_id';
20 protected $_table = 'ecommerce_carts_products';
21 private $firstProduct;
22 private $secondProduct;
26 protected function setUp()
28 $this->useModelSet('ecommerce');
30 $this->firstProduct = new ECommerceProduct();
31 $this->firstProduct->setName('Doctrine 1.x Manual');
32 $this->secondProduct = new ECommerceProduct();
33 $this->secondProduct->setName('Doctrine 2.x Manual');
34 $this->firstCart = new ECommerceCart();
35 $this->secondCart = new ECommerceCart();
38 public function testSavesAManyToManyAssociationWithCascadeSaveSet()
40 $this->firstCart->addProduct($this->firstProduct);
41 $this->firstCart->addProduct($this->secondProduct);
42 $this->_em->persist($this->firstCart);
45 $this->assertForeignKeysContain($this->firstCart->getId(), $this->firstProduct->getId());
46 $this->assertForeignKeysContain($this->firstCart->getId(), $this->secondProduct->getId());
49 public function testRemovesAManyToManyAssociation()
51 $this->firstCart->addProduct($this->firstProduct);
52 $this->firstCart->addProduct($this->secondProduct);
53 $this->_em->persist($this->firstCart);
54 $this->firstCart->removeProduct($this->firstProduct);
58 $this->assertForeignKeysNotContain($this->firstCart->getId(), $this->firstProduct->getId());
59 $this->assertForeignKeysContain($this->firstCart->getId(), $this->secondProduct->getId());
62 public function testEagerLoad()
64 $this->_createFixture();
66 $query = $this->_em->createQuery('SELECT c, p FROM Doctrine\Tests\Models\ECommerce\ECommerceCart c LEFT JOIN c.products p ORDER BY c.id, p.id');
67 $result = $query->getResult();
68 $firstCart = $result[0];
69 $products = $firstCart->getProducts();
70 $secondCart = $result[1];
72 $this->assertInstanceOf('Doctrine\Tests\Models\ECommerce\ECommerceProduct', $products[0]);
73 $this->assertInstanceOf('Doctrine\Tests\Models\ECommerce\ECommerceProduct', $products[1]);
74 $this->assertCollectionEquals($products, $secondCart->getProducts());
75 //$this->assertEquals("Doctrine 1.x Manual", $products[0]->getName());
76 //$this->assertEquals("Doctrine 2.x Manual", $products[1]->getName());
79 public function testLazyLoadsCollection()
81 $this->_createFixture();
82 $metadata = $this->_em->getClassMetadata('Doctrine\Tests\Models\ECommerce\ECommerceCart');
83 $metadata->associationMappings['products']['fetch'] = ClassMetadata::FETCH_LAZY;
85 $query = $this->_em->createQuery('SELECT c FROM Doctrine\Tests\Models\ECommerce\ECommerceCart c');
86 $result = $query->getResult();
87 $firstCart = $result[0];
88 $products = $firstCart->getProducts();
89 $secondCart = $result[1];
91 $this->assertInstanceOf('Doctrine\Tests\Models\ECommerce\ECommerceProduct', $products[0]);
92 $this->assertInstanceOf('Doctrine\Tests\Models\ECommerce\ECommerceProduct', $products[1]);
93 $this->assertCollectionEquals($products, $secondCart->getProducts());
96 private function _createFixture()
98 $this->firstCart->addProduct($this->firstProduct);
99 $this->firstCart->addProduct($this->secondProduct);
100 $this->secondCart->addProduct($this->firstProduct);
101 $this->secondCart->addProduct($this->secondProduct);
102 $this->_em->persist($this->firstCart);
103 $this->_em->persist($this->secondCart);