Doctrine: Many-To-Many, Self-referencing v PHP atributech
19. 5. 2022Používání atributů je zcela nový způsob jak zapisovat strukturovaná metadata ke třídám, metodám a funkcím místo doposud využívaného zápisu v phpDoc. Atributy jsou dostupné od PHP verze 8 a novější.
Přepis Doctrine anotací do atributů se v některých bodech lehce liší. Příkladem níže je zápis vazby Many-To-Many která ukazuje sama na sebe (Self-referencing). Pokud provádíte migraci starého projektu do nových standardů je nutné si dát pozor na absenci metody “joinColumns” a “inverseJoinColumns”. Připojení sloupců se provádí nově atributy “#[JoinColumn()]” a “#[InverseJoinColumn()]”.
<?php
/** @Entity */
class User
{
// ...
/**
* PHP Annotations
*
* Many Users have Many Users.
* @ManyToMany(targetEntity="User", mappedBy="myFriends")
*/
// PHP Attributes:
#[ManyToMany(targetEntity: User::class, mappedBy: 'myFriends')]
private $friendsWithMe;
/**
* PHP Annotations
*
* Many Users have many Users.
* @ManyToMany(targetEntity="User", inversedBy="friendsWithMe")
* @JoinTable(name="friends",
* joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="friend_user_id", referencedColumnName="id")}
* )
*/
// PHP Attributes:
#[ManyToMany(targetEntity: User::class, inversedBy: 'friendsWithMe')]
#[JoinTable(name: 'friends')]
#[JoinColumn(name: 'user_id', referencedColumnName: 'id')]
#[InverseJoinColumn(name: 'friend_user_id', referencedColumnName: 'id')]
private $myFriends;
public function __construct() {
$this->friendsWithMe = new \Doctrine\Common\Collections\ArrayCollection();
$this->myFriends = new \Doctrine\Common\Collections\ArrayCollection();
}
// ...
}