doctrine2 многие ко многим ссылаются на себя с промежуточными деталями - PullRequest
1 голос
/ 09 ноября 2011

Я хотел бы создать самоссылающуюся сущность, но с описанием (и, возможно, другой информацией) об отношениях. Примером этого могут быть друзья в приложении для социальной сети - Лицо A (сущность) может связываться с Лицом B (сущностью), однако их отношения могут быть описаны как «друг», «брат», «дядя» и т. Д.

Из документации Doctrine можно сослаться на класс с помощью таблицы ссылок, используя следующее:

<?php
/** @Entity */
class User
{
    // ...

    /**
     * @ManyToMany(targetEntity="User", mappedBy="myFriends")
     */
    private $friendsWithMe;

    /**
     * @ManyToMany(targetEntity="User", inversedBy="friendsWithMe")
     * @JoinTable(name="friends",
     *      joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(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();
    }

    // ...
}

однако не похоже, что вы можете добавить свойства, используя этот метод.

Вопрос в том, есть ли способ справиться с этим в одном классе (например, User.php) - или нужно было бы на самом деле создать класс "link", такой как UserLink.php? Я как бы застрял, создавая класс ссылок, когда начал отношения:

class UserLink
{
    // ...

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    protected $relationship; // being brother, uncle etc

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="links")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     * @var type
     */
    private $user;
}

Но я не уверен, что будет дальше ...?

Изучая стекопоток, я нашел похожие вопросы, но больше о прямых ссылках.

Doctrine2: лучший способ справиться со многими ко многим с помощью дополнительных столбцов в справочной таблице

Нужна помощь в понимании Учения многие ко многим самоссылающимся кодам

1 Ответ

3 голосов
/ 17 ноября 2011

Решил так:

User.php

/**
 * @ORM\OneToMany(targetEntity="UserLink", mappedBy="user")
 */
private $relations;    

UserLink.php

/**
 * @ORM\Column(type="text", nullable=true)
 */
protected $relationship;

/**
 * @ORM\ManyToOne(targetEntity="User", inversedBy="relations")
 * @ORM\JoinColumn(name="user_ud", referencedColumnName="id")
 */
protected $user;

/**
 * @ORM\ManyToOne(targetEntity="User")
 * @ORM\JoinColumn(name="related_user_id", referencedColumnName="id")
 */
protected $relateduser;

Требуется немного больше кода в контроллере и модели, но работает довольно хорошо. Это позволяет пользователю вызывать getRelations:

{% for link in user.relations %}
    {{ link.relateduser.name }} ({{ link.relationship }})
{% endfor %}
...