Doctrine: Many-To-Many, Self-referencing v PHP atributech

19. 5. 2022

Použí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();
    }

    // ...
}

Nejnovější příspěvky