1
0
mirror of synced 2024-12-14 15:16:04 +03:00
doctrine2/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2138Test.php
2012-11-12 14:59:48 +01:00

318 lines
7.3 KiB
PHP

<?php
namespace Doctrine\Tests\ORM\Functional\Ticket;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Tests\OrmFunctionalTestCase;
use Doctrine\ORM\Tools\SchemaTool;
class DDC2138Test extends OrmFunctionalTestCase
{
/**
* @group DDC-2138
*/
public function testForeignKeyOnSTIWithMultipleMapping()
{
$em = $this->_em;
$schemaTool = new SchemaTool($em);
$classes = array(
$em->getClassMetadata(__NAMESPACE__ . '\DDC2138User'),
$em->getClassMetadata(__NAMESPACE__ . '\DDC2138Structure'),
$em->getClassMetadata(__NAMESPACE__ . '\DDC2138UserFollowedObject'),
$em->getClassMetadata(__NAMESPACE__ . '\DDC2138UserFollowedStructure'),
$em->getClassMetadata(__NAMESPACE__ . '\DDC2138UserFollowedUser')
);
$schema = $schemaTool->getSchemaFromMetadata($classes);
$this->assertTrue($schema->hasTable('users_followed_objects'), "Table users_followed_objects should exist.");
/* @var $table \Doctrine\DBAL\Schema\Table */
$table = ($schema->getTable('users_followed_objects'));
$this->assertTrue($table->columnsAreIndexed(array('object_id')));
$this->assertTrue($table->columnsAreIndexed(array('user_id')));
$foreignKeys = $table->getForeignKeys();
$this->assertCount(1, $foreignKeys, 'user_id column has to have FK, but not object_id');
/* @var $fk \Doctrine\DBAL\Schema\ForeignKeyConstraint */
$fk = reset($foreignKeys);
$this->assertEquals('users', $fk->getForeignTableName());
$localColumns = $fk->getLocalColumns();
$this->assertContains('user_id', $localColumns);
$this->assertCount(1, $localColumns);
}
}
/**
* @Table(name="structures")
* @Entity
*/
class DDC2138Structure
{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @Column(type="string", length=32, nullable=true)
*/
protected $name;
}
/**
* @Entity
* @Table(name="users_followed_objects")
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="object_type", type="smallint")
* @DiscriminatorMap({4 = "DDC2138UserFollowedUser", 3 = "DDC2138UserFollowedStructure"})
*/
abstract class DDC2138UserFollowedObject
{
/**
* @var integer $id
*
* @Column(name="id", type="integer")
* @Id
* @GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
}
/**
* @Entity
*/
class DDC2138UserFollowedStructure extends DDC2138UserFollowedObject
{
/**
* @ManyToOne(targetEntity="DDC2138User", inversedBy="followedStructures")
* @JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
* @var User $user
*/
protected $user;
/**
* @ManyToOne(targetEntity="DDC2138Structure")
* @JoinColumn(name="object_id", referencedColumnName="id", nullable=false)
* @var Structure $followedStructure
*/
private $followedStructure;
/**
* Construct a UserFollowedStructure entity
*
* @param User $user
* @param Structure $followedStructure
*/
public function __construct(User $user, Structure $followedStructure)
{
$this->user = $user;
$this->followedStructure = $followedStructure;
}
/**
*
* @return User
*/
public function getUser()
{
return $this->user;
}
/**
* Gets followed structure
*
* @return Structure
*/
public function getFollowedStructure()
{
return $this->followedStructure;
}
}
/**
* @Entity
*/
class DDC2138UserFollowedUser extends DDC2138UserFollowedObject
{
/**
* @ManyToOne(targetEntity="DDC2138User", inversedBy="followedUsers")
* @JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
* @var User $user
*/
protected $user;
/**
* @ManyToOne(targetEntity="DDC2138User")
* @JoinColumn(name="object_id", referencedColumnName="id", nullable=false)
* @var User $user
*/
private $followedUser;
/**
* Construct a UserFollowedUser entity
*
* @param User $user
* @param User $followedUser
* @param bool $giveAgency
*/
public function __construct(User $user, User $followedUser)
{
$this->user = $user;
$this->followedUser = $followedUser;
}
/**
* {@inheritdoc}
*/
public function getUser()
{
return $this->user;
}
/**
* Gets followed user
*
* @return User
*/
public function getFollowedUser()
{
return $this->followedUser;
}
}
/**
* @Table(name="users")
* @Entity
*/
class DDC2138User
{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @Column(type="string", length=32, nullable=true)
*/
protected $name;
/**
* @var ArrayCollection $followedUsers
* @OneToMany(targetEntity="DDC2138UserFollowedUser", mappedBy="user", cascade={"persist"}, orphanRemoval=true)
*/
protected $followedUsers;
/**
* @var ArrayCollection $followedStructures
* @OneToMany(targetEntity="DDC2138UserFollowedStructure", mappedBy="user", cascade={"persist"}, orphanRemoval=true)
*/
protected $followedStructures;
public function __construct()
{
$this->followedUsers = new ArrayCollection();
$this->followedStructures = new ArrayCollection();
}
/*
* Remove followers
*
* @param UserFollowedUser $followers
*/
private function removeFollower(UserFollowedUser $followers)
{
$this->followers->removeElement($followers);
}
/**
* Add followedUsers
*
* @param UserFollowedUser $followedUsers
* @return User
*/
public function addFollowedUser(UserFollowedUser $followedUsers)
{
$this->followedUsers[] = $followedUsers;
return $this;
}
/**
* Remove followedUsers
*
* @param UserFollowedUser $followedUsers
* @return User
*/
public function removeFollowedUser(UserFollowedUser $followedUsers)
{
$this->followedUsers->removeElement($followedUsers);
return $this;
}
/**
* Get followedUsers
*
* @return Doctrine\Common\Collections\Collection
*/
public function getFollowedUsers()
{
return $this->followedUsers;
}
/**
* Add followedStructures
*
* @param UserFollowedStructure $followedStructures
* @return User
*/
public function addFollowedStructure(UserFollowedStructure $followedStructures)
{
$this->followedStructures[] = $followedStructures;
return $this;
}
/**
* Remove followedStructures
*
* @param UserFollowedStructure $followedStructures
* @return User
*/
public function removeFollowedStructure(UserFollowedStructure $followedStructures)
{
$this->followedStructures->removeElement($followedStructures);
return $this;
}
/**
* Get followedStructures
*
* @return Doctrine\Common\Collections\Collection
*/
public function getFollowedStructures()
{
return $this->followedStructures;
}
}