Back

Uncategorized

Doctrine 2, Many-to-Many und Composite Keys

This post is also available in: Deutsch (German)

Es gebe 3 Entitäten: slides, modules und user.

slides identifizieren sich über ihre Modulzugehörigkeit sowie eine eigene Slidenummer innerhalb dieses Moduls – es gibt also einen kombinierten Primärschlüssel aus (module_id, slideNumber), auf Englisch auch Composite Key genannt.

[code lang=”php”]

/**
*
* @author lukasdomnick
* @ORM\Table(name="slides")
* @ORM\Entity
*/
class Slide
{

/**
* @ORM\Id
* @ORM\Column(type="integer")
*/
private $slideNumber;

/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity="Module", inversedBy="slides")
* @ORM\JoinColumn(name="module_id", referencedColumnName="id")
*/
private $module;

// und so weiter
}
[/code]

Nun möchte ich erfassen, welcher User welches Slide gesehen hat. Es ist also eine irgendwie geartete Many-To-Many (oder N:M, oder wie auch immer)-Verknüpfung zwischen slides und users erforderlich. Auch das kann Doctrine 2 uns abnehmen; die Doku spricht dazu jedoch nur sparsam.

Da in diesem Fall der User die “owning Side” ist, wird die doch etwas komplexere Annotation für diese Relation genau hier definiert:

[code lang=”php”]
// User.php
// …
/**
* Viewed Slides
*
* @var Collection
*
* @ORM\ManyToMany(targetEntity="Slide", inversedBy="users")
* @ORM\JoinTable(name="user_viewedslides",
* inverseJoinColumns={
* @ORM\JoinColumn(name="slideNumber", referencedColumnName="slideNumber"),
* @ORM\JoinColumn(name="module_id", referencedColumnName="module_id")
* },
* joinColumns={
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* }
* )
*/
private $viewedSlides;
// …
[/code]

Auf der Inverse Side, also in der Slide-Klasse, reicht dann die folgende Annotation wie gewohnt völlig aus:

[code lang=”php”]
// Slide.php
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="viewedSlides")
*/
private $users;
[/code]

Nachdem nun die Entitys generiert und das Schema upgedated wurden, kann ich auf dem User mit ->getViewedSlides() die Collection der gesehenen Slides abrufen.

Veröffentlicht: 13. August 2012 // antwerpes


Back