diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2138Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2138Test.php new file mode 100644 index 000000000..87fb16d84 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2138Test.php @@ -0,0 +1,317 @@ +_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; + } +} diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC258Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC258Test.php index 0d766eaa0..39b918d26 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC258Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC258Test.php @@ -1,8 +1,6 @@ schemaCalled = true; } -} \ No newline at end of file +}