ManyToManyUnidirectionalAssociationTest.php 4.06 KB
Newer Older
1 2 3 4 5 6
<?php

namespace Doctrine\Tests\ORM\Functional;

use Doctrine\Tests\Models\ECommerce\ECommerceCart;
use Doctrine\Tests\Models\ECommerce\ECommerceProduct;
7
use Doctrine\ORM\Mapping\AssociationMapping;
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

require_once __DIR__ . '/../../TestInit.php';

/**
 * Tests a unidirectional many-to-many association mapping (without inheritance).
 * Inverse side is not present.
 */
class ManyToManyUnidirectionalAssociationTest extends AbstractManyToManyAssociationTestCase
{
    protected $_firstField = 'cart_id';
    protected $_secondField = 'product_id';
    protected $_table = 'ecommerce_carts_products';
    private $firstProduct;
    private $secondProduct;
    private $firstCart;
    private $secondCart;

    protected function setUp()
    {
        $this->useModelSet('ecommerce');
        parent::setUp();
        $this->firstProduct = new ECommerceProduct();
        $this->firstProduct->setName('Doctrine 1.x Manual');
        $this->secondProduct = new ECommerceProduct();
        $this->secondProduct->setName('Doctrine 2.x Manual');
        $this->firstCart = new ECommerceCart();
        $this->secondCart = new ECommerceCart();
    }

    public function testSavesAManyToManyAssociationWithCascadeSaveSet()
    {
        $this->firstCart->addProduct($this->firstProduct);
        $this->firstCart->addProduct($this->secondProduct);
romanb's avatar
romanb committed
41
        $this->_em->persist($this->firstCart);
42 43
        $this->_em->flush();
        
44 45
        $this->assertForeignKeysContain($this->firstCart->getId(), $this->firstProduct->getId());
        $this->assertForeignKeysContain($this->firstCart->getId(), $this->secondProduct->getId());
46 47 48 49 50 51
    }

    public function testRemovesAManyToManyAssociation()
    {
        $this->firstCart->addProduct($this->firstProduct);
        $this->firstCart->addProduct($this->secondProduct);
romanb's avatar
romanb committed
52
        $this->_em->persist($this->firstCart);
53 54 55 56
        $this->firstCart->removeProduct($this->firstProduct);

        $this->_em->flush();

57 58
        $this->assertForeignKeysNotContain($this->firstCart->getId(), $this->firstProduct->getId());
        $this->assertForeignKeysContain($this->firstCart->getId(), $this->secondProduct->getId());
59 60 61 62
    }

    public function testEagerLoad()
    {
63
        $this->_createFixture();
64 65

        $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');
66
        $result = $query->getResult();
67 68 69 70 71 72 73 74 75 76 77
        $firstCart = $result[0];
        $products = $firstCart->getProducts();
        $secondCart = $result[1];
        
        $this->assertTrue($products[0] instanceof ECommerceProduct);
        $this->assertTrue($products[1] instanceof ECommerceProduct);
        $this->assertCollectionEquals($products, $secondCart->getProducts());
        //$this->assertEquals("Doctrine 1.x Manual", $products[0]->getName());
        //$this->assertEquals("Doctrine 2.x Manual", $products[1]->getName());
    }
    
78 79 80 81 82 83 84
    public function testLazyLoadsCollection()
    {
        $this->_createFixture();
        $metadata = $this->_em->getClassMetadata('Doctrine\Tests\Models\ECommerce\ECommerceCart');
        $metadata->getAssociationMapping('products')->fetchMode = AssociationMapping::FETCH_LAZY;

        $query = $this->_em->createQuery('SELECT c FROM Doctrine\Tests\Models\ECommerce\ECommerceCart c');
85
        $result = $query->getResult();
86 87 88
        $firstCart = $result[0];
        $products = $firstCart->getProducts();
        $secondCart = $result[1];
89
        
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
        $this->assertTrue($products[0] instanceof ECommerceProduct);
        $this->assertTrue($products[1] instanceof ECommerceProduct);
        $this->assertCollectionEquals($products, $secondCart->getProducts());
    }

    private function _createFixture()
    {
        $this->firstCart->addProduct($this->firstProduct);
        $this->firstCart->addProduct($this->secondProduct);
        $this->secondCart->addProduct($this->firstProduct);
        $this->secondCart->addProduct($this->secondProduct);
        $this->_em->persist($this->firstCart);
        $this->_em->persist($this->secondCart);
        
        $this->_em->flush();
        $this->_em->clear();
    }
107
}