【问题标题】:Symfony2 Doctrine ManyToMany relationship not reconizedSymfony2 Doctrine 多对多关系无法识别
【发布时间】:2014-05-29 11:10:15
【问题描述】:

我正在尝试创建多对多关系。代码如下:

文章.php

namespace Heitor\ProjetoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Article
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Article
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

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

    /**
     * @var string
     *
     * @ORM\Column(name="text", type="text")
     */
    protected $text;

    /**
     * @ORM\ManyToOne(targetEntity="Author", inversedBy="articles")
     */
    protected $author;

    /*
     * @ORM\ManyToMany(targetEntity="Tag", inversedBy="articles")
     * @ORM\JoinTable(name="articles_tags")
     */
    protected $tags;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set title
     *
     * @param string $title
     * @return Article
     */
    public function setTitle($title)
    {
        $this->title = $title;

        return $this;
    }

    /**
     * Get title
     *
     * @return string 
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * Set text
     *
     *
     * @param string $text
     * @return Article
     */
    public function setText($text)
    {
        $this->text = $text;

        return $this;
    }

    /**
     * Get text
     *
     * @return string 
     */
    public function getText()
    {
        return $this->text;
    }

    /**
     * Set author
     *
     * @param \Heitor\ProjetoBundle\Entity\Author $author
     * @return Article
     */
    public function setAuthor(\Heitor\ProjetoBundle\Entity\Author $author = null)
    {
        $this->author = $author;

        return $this;
    }

    /**
     * Get author
     *
     * @return \Heitor\ProjetoBundle\Entity\Author 
     */
    public function getAuthor()
    {
        return $this->author;
    }
}

标签.php

namespace Heitor\ProjetoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

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

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

    /**
     * @ORM\ManyToMany(targetEntity="Article", mappedBy="tags")
     */
    protected $articles;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->articles = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set description
     *
     * @param string $description
     * @return Tag
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Add articles
     *
     * @param \Heitor\ProjetoBundle\Entity\Article $articles
     * @return Tag
     */
    public function addArticle(\Heitor\ProjetoBundle\Entity\Article $articles)
    {
        $this->articles[] = $articles;

        return $this;
    }

    /**
     * Remove articles
     *
     * @param \Heitor\ProjetoBundle\Entity\Article $articles
     */
    public function removeArticle(\Heitor\ProjetoBundle\Entity\Article $articles)
    {
        $this->articles->removeElement($articles);
    }

    /**
     * Get articles
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getArticles()
    {
        return $this->articles;
    }
}

每个类的方法都是通过命令doctrine:generate:entites自动生成的,我只是事先做了属性和映射。

然后,当我尝试使用 doctrine:schema:update --dump-sql 创建表时,它不会尝试创建 articles_tags 关系:

CREATE TABLE Tag (id INT AUTO_INCREMENT NOT NULL, description VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
CREATE TABLE Author (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
CREATE TABLE Article (id INT AUTO_INCREMENT NOT NULL, author_id INT DEFAULT NULL, title VARCHAR(255) NOT NULL, text LONGTEXT NOT NULL, INDEX IDX_CD8737FAF675F31B (author_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
ALTER TABLE Article ADD CONSTRAINT FK_CD8737FAF675F31B FOREIGN KEY (author_id) REFERENCES Author (id);

为什么不尝试在 Article.php 上创建 addTag & 等方法?为什么它不尝试创建 ManyToMany joinTable?

【问题讨论】:

    标签: php symfony orm doctrine-orm relationships


    【解决方案1】:

    您是否尝试过添加连接列?也许有帮助。

    /**
     * @ORM\ManyToMany(targetEntity="Tag", inversedBy="articles")
     * @ORM\JoinTable(name="articles_tags",
     *      joinColumns={@JoinColumn(name="tag_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="article_id", referencedColumnName="id")}
     *      )
     */
     protected $tags;
    

    另外,您似乎后来添加了标签,却忘记再次调用生成实体,因为我在您的代码中找不到标签的 getter 和 setter。尝试再次运行doctrine:generate:entites

    最后,您是否检查过您的数据库中还没有该表? (这应该是不可能的,但检查一下你是否有其他想法也无妨。)

    【讨论】:

    • 刚刚尝试添加连接列,行为相同。我尝试再次运行doctrine:generate:entities,但它仍然没有为标签创建方法(例如:addTag)。这就是重点:由于某种原因,它不会将 $tags 重新定义为关系,因此它不会创建方法,也不会尝试创建表。
    • 尝试验证:doctrine:schema:validate。请发布您的结果。
    • 哦,你错过了起始评论双星.../** 而不是/*。那一定是罪魁祸首!我也错过了,刚刚进行了编辑。
    • 不可能!那行得通。谢谢,Symfony 注释解析器!
    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多