2009-07-06 16:42:14 +04:00
< ? php
namespace Doctrine\Tests\ORM\Functional ;
use Doctrine\Tests\Models\ECommerce\ECommerceCustomer ;
2009-07-28 15:43:42 +04:00
use Doctrine\ORM\Mapping\AssociationMapping ;
2010-08-09 15:13:21 +04:00
use Doctrine\ORM\Mapping\ClassMetadata ;
2009-07-06 16:42:14 +04:00
require_once __DIR__ . '/../../TestInit.php' ;
/**
* Tests a self referential one - to - one association mapping ( without inheritance ) .
2011-12-20 01:56:19 +04:00
* Relation is defined as the mentor that a customer choose . The mentor could
2009-07-06 16:42:14 +04:00
* help only one other customer , while a customer can choose only one mentor
* for receiving support .
* Inverse side is not present .
*/
class OneToOneSelfReferentialAssociationTest extends \Doctrine\Tests\OrmFunctionalTestCase
{
private $customer ;
private $mentor ;
protected function setUp ()
{
$this -> useModelSet ( 'ecommerce' );
parent :: setUp ();
$this -> customer = new ECommerceCustomer ();
$this -> customer -> setName ( 'Anakin Skywalker' );
$this -> mentor = new ECommerceCustomer ();
$this -> mentor -> setName ( 'Obi-wan Kenobi' );
}
public function testSavesAOneToOneAssociationWithCascadeSaveSet () {
$this -> customer -> setMentor ( $this -> mentor );
2009-07-19 20:54:53 +04:00
$this -> _em -> persist ( $this -> customer );
2009-07-18 15:41:37 +04:00
$this -> _em -> flush ();
2011-12-20 01:56:19 +04:00
2009-07-06 16:42:14 +04:00
$this -> assertForeignKeyIs ( $this -> mentor -> getId ());
}
public function testRemovesOneToOneAssociation ()
{
$this -> customer -> setMentor ( $this -> mentor );
2009-07-19 20:54:53 +04:00
$this -> _em -> persist ( $this -> customer );
2009-07-06 16:42:14 +04:00
$this -> customer -> removeMentor ();
$this -> _em -> flush ();
$this -> assertForeignKeyIs ( null );
}
2011-07-09 17:40:10 +04:00
public function testFind ()
{
$id = $this -> _createFixture ();
$customer = $this -> _em -> find ( 'Doctrine\Tests\Models\ECommerce\ECommerceCustomer' , $id );
$this -> assertNotInstanceOf ( 'Doctrine\ORM\Proxy\Proxy' , $customer -> getMentor ());
}
2009-07-28 15:43:42 +04:00
public function testEagerLoadsAssociation ()
2009-07-06 16:42:14 +04:00
{
2009-07-28 15:43:42 +04:00
$this -> _createFixture ();
2009-07-06 16:42:14 +04:00
2009-07-18 15:41:37 +04:00
$query = $this -> _em -> createQuery ( 'select c, m from Doctrine\Tests\Models\ECommerce\ECommerceCustomer c left join c.mentor m order by c.id asc' );
2009-08-03 21:18:37 +04:00
$result = $query -> getResult ();
2009-07-06 16:42:14 +04:00
$customer = $result [ 0 ];
2009-07-28 15:43:42 +04:00
$this -> assertLoadingOfAssociation ( $customer );
}
2011-12-20 01:56:19 +04:00
2009-08-13 14:13:06 +04:00
/**
* @ group mine
* @ return unknown_type
*/
2009-07-28 15:43:42 +04:00
public function testLazyLoadsAssociation ()
2011-12-20 01:56:19 +04:00
{
2009-07-28 15:43:42 +04:00
$this -> _createFixture ();
$metadata = $this -> _em -> getClassMetadata ( 'Doctrine\Tests\Models\ECommerce\ECommerceCustomer' );
2010-08-09 15:13:21 +04:00
$metadata -> associationMappings [ 'mentor' ][ 'fetch' ] = ClassMetadata :: FETCH_LAZY ;
2011-12-20 01:56:19 +04:00
2009-08-13 14:13:06 +04:00
$query = $this -> _em -> createQuery ( " select c from Doctrine \T ests \ Models \ ECommerce \ ECommerceCustomer c where c.name='Luke Skywalker' " );
2009-08-03 21:18:37 +04:00
$result = $query -> getResult ();
2009-07-28 15:43:42 +04:00
$customer = $result [ 0 ];
$this -> assertLoadingOfAssociation ( $customer );
}
2011-12-20 01:56:19 +04:00
2009-11-15 14:42:05 +03:00
public function testMultiSelfReference ()
{
try {
$this -> _schemaTool -> createSchema ( array (
$this -> _em -> getClassMetadata ( 'Doctrine\Tests\ORM\Functional\MultiSelfReference' )
));
} catch ( \Exception $e ) {
// Swallow all exceptions. We do not test the schema tool here.
}
2011-12-20 01:56:19 +04:00
2009-11-15 14:42:05 +03:00
$entity1 = new MultiSelfReference ();
$this -> _em -> persist ( $entity1 );
$entity1 -> setOther1 ( $entity2 = new MultiSelfReference );
$entity1 -> setOther2 ( $entity3 = new MultiSelfReference );
$this -> _em -> flush ();
2011-12-20 01:56:19 +04:00
2009-11-15 14:42:05 +03:00
$this -> _em -> clear ();
2011-12-20 01:56:19 +04:00
2009-11-15 14:42:05 +03:00
$entity2 = $this -> _em -> find ( get_class ( $entity1 ), $entity1 -> getId ());
2011-12-20 01:56:19 +04:00
2011-07-26 17:22:57 +04:00
$this -> assertInstanceOf ( 'Doctrine\Tests\ORM\Functional\MultiSelfReference' , $entity2 -> getOther1 ());
$this -> assertInstanceOf ( 'Doctrine\Tests\ORM\Functional\MultiSelfReference' , $entity2 -> getOther2 ());
2009-11-15 14:42:05 +03:00
$this -> assertNull ( $entity2 -> getOther1 () -> getOther1 ());
$this -> assertNull ( $entity2 -> getOther1 () -> getOther2 ());
$this -> assertNull ( $entity2 -> getOther2 () -> getOther1 ());
$this -> assertNull ( $entity2 -> getOther2 () -> getOther2 ());
}
2009-07-28 15:43:42 +04:00
public function assertLoadingOfAssociation ( $customer )
{
2011-07-26 17:22:57 +04:00
$this -> assertInstanceOf ( 'Doctrine\Tests\Models\ECommerce\ECommerceCustomer' , $customer -> getMentor ());
2009-07-06 16:42:14 +04:00
$this -> assertEquals ( 'Obi-wan Kenobi' , $customer -> getMentor () -> getName ());
}
public function assertForeignKeyIs ( $value ) {
2010-04-01 01:13:34 +04:00
$foreignKey = $this -> _em -> getConnection () -> executeQuery ( 'SELECT mentor_id FROM ecommerce_customers WHERE id=?' , array ( $this -> customer -> getId ())) -> fetchColumn ();
2009-07-06 16:42:14 +04:00
$this -> assertEquals ( $value , $foreignKey );
}
2009-07-28 15:43:42 +04:00
private function _createFixture ()
{
$customer = new ECommerceCustomer ;
$customer -> setName ( 'Luke Skywalker' );
$mentor = new ECommerceCustomer ;
$mentor -> setName ( 'Obi-wan Kenobi' );
$customer -> setMentor ( $mentor );
2011-12-20 01:56:19 +04:00
2009-07-28 15:43:42 +04:00
$this -> _em -> persist ( $customer );
2011-12-20 01:56:19 +04:00
2009-07-28 15:43:42 +04:00
$this -> _em -> flush ();
$this -> _em -> clear ();
2011-07-09 17:40:10 +04:00
return $customer -> getId ();
2009-07-28 15:43:42 +04:00
}
2009-07-06 16:42:14 +04:00
}
2009-11-15 14:42:05 +03:00
/**
* @ Entity
*/
class MultiSelfReference {
/** @Id @GeneratedValue(strategy="AUTO") @Column(type="integer") */
private $id ;
/**
* @ OneToOne ( targetEntity = " MultiSelfReference " , cascade = { " persist " })
* @ JoinColumn ( name = " other1 " , referencedColumnName = " id " )
*/
private $other1 ;
/**
* @ OneToOne ( targetEntity = " MultiSelfReference " , cascade = { " persist " })
* @ JoinColumn ( name = " other2 " , referencedColumnName = " id " )
*/
private $other2 ;
2011-12-20 01:56:19 +04:00
2009-11-15 14:42:05 +03:00
public function getId () { return $this -> id ;}
public function setOther1 ( $other1 ) { $this -> other1 = $other1 ;}
public function getOther1 () { return $this -> other1 ;}
public function setOther2 ( $other2 ) { $this -> other2 = $other2 ;}
public function getOther2 () { return $this -> other2 ;}
}