使用Doctrine 2管理多对多标签

时间:2011-08-30 07:29:05

标签: sql doctrine-orm symfony

我对标记的工作原理感兴趣。我的想法到目前为止:

我有三个数据库表Bookmarks id|title|uri|…Tags id|title|…和bookmarks_tags(mxm,3NF)。我的第一个测试只是单用户系统,所以我不需要处理特定用户拥有的标签。

存储书签:uri(字符串)+ tags(字符串,例如。Lorem Ipsum, Hello应生成两个标记:Lorem IpsumHello)。

问题:我应该在哪里以及如何创建缺失的Tags并加载已知的?{/ p>

可以在模型中创建标签(请参阅下面的Bookmark :: setTags())。在模型中加载和链接似乎是不可能的,因为ORM在类中是不可用的(或者是否有用于获取ORM的静态ressource?这会被推荐吗?)。

我可以加载现有标签并在Controller内创建标签,但我认为标记应该是模型的工作。

我正在使用Sytrfony2和Doctrine2。

Bookmark Class / Table

 * @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 个答案:

答案 0 :(得分:1)

从数据库中获取实体时,Doctrine2不会为您提供POPO实体,而是提供“代理”。此代理能够从数据库中加载缺少的元素。因此,您不必实现从数据库中检索丢失数据的逻辑。

顺便说一句,你也可以创建这个方法:

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