управление тегами «многие ко многим» с помощью Doctrine2 - PullRequest
1 голос
/ 30 августа 2011

Мне интересно, как работает тегирование. Моя идея пока:

У меня есть три таблицы базы данных Bookmarks id|title|uri|…, Tags id|title|… и bookmarks_tags (mxm, 3NF). Моим первым тестом будет только однопользовательская система, поэтому мне не придется иметь дело с тегами, принадлежащими конкретным пользователям.

Хранение закладки: uri (String) + tags (Строка, например, Lorem Ipsum, Hello должна приводить к двум тегам: Lorem Ipsum и Hello).

Проблема: где и как мне создать недостающий Tags и загрузить известные?

Возможно создание тегов в модели (см. Bookmark :: setTags () ниже). Загрузка и компоновка в модели, по-видимому, невозможны, поскольку ORM недоступен внутри класса (или есть статический ресурс для извлечения ORM? Это будет рекомендовано?).

Я мог бы загрузить существующие теги и создать теги внутри Controller, но я предполагаю, что тегирование должно быть работой модели.

Я использую Symfony2 с Doctrine2.

Класс закладок / Таблица

 * @ORM\Table()
 * @ORM\Entity(repositoryClass="X\BookmarksBundle\Entity\BookmarkRepository")
 */
class Bookmark
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $title
     *
     * @ORM\Column(name="title", type="string", length=255)
     */
    private $title;

    /**
     * @var string $uri
     *
     * @ORM\Column(name="uri", type="string", length=255)
     */
    private $uri;

    /**
     * @var datetime $created_at
     *
     * @ORM\Column(name="created_at", type="datetime")
     */
    private $created_at;

    /**
     * @var datetime $deleted_at
     *
     * @ORM\Column(name="deleted_at", type="datetime")
     */
    private $deleted_at;


    /** @ORM\ManyToMany(targetEntity="Tag", cascade={"persist", "remove"}) */
    private $tags;



    public function __construct()
    {
        $this->tags = new ArrayCollection();
    }

    public function getTags () {
        if ($this->tags->isEmpty()) {
            return "NO TAGS";
        }

        // TODO load tags from db
        return "TODO: TAGS FOUND";
    }

    public function setTags ($tags) {
        // TODO create and load/link existing tags
        $tag = new Tag();
        $tag->setTitle("test tag");
        $this->tags->add($tag);
    }

    /* setters and getters for other private variables here */

Класс тегов / Таблица

 * @ORM\Table()
 * @ORM\Entity(repositoryClass="X\BookmarksBundle\Entity\TagRepository")
 */
class Tag
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $title
     *
     * @ORM\Column(name="title", type="string", length=64)
     */
    private $title;

    /**
     * @var datetime $created_at
     *
     * @ORM\Column(name="created_at", type="datetime")
     */
    private $created_at;

    /**
     * @var datetime $deleted_at
     *
     * @ORM\Column(name="deleted_at", type="datetime", nullable=true)
     */
    private $deleted_at;


    public function __construct () {
        $this->created_at = new \DateTime('now');
    }

        /* setters and getters for other private variables here */

1 Ответ

1 голос
/ 30 августа 2011

При извлечении сущностей из вашей базы данных Doctrine2 выдает не сущность POPO, а «прокси».Этот прокси имеет возможность загружать недостающие элементы из базы данных.Таким образом, вам не нужно реализовывать логику извлечения недостающих данных из базы данных.

Кстати, вы также можете создать этот метод:

public function addTag(Tag $tag)
{
    $this->tags->add($tag);
}
...