简体   繁体   English

Symfony2学说ManyToMany关系未调和

[英]Symfony2 Doctrine ManyToMany relationship not reconized

I'm trying to create a ManyToMany relationship. 我正在尝试创建ManyToMany关系。 Here's the code: 这是代码:

Article.php Article.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;
    }
}

Tag.php Tag.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;
    }
}

The methods on each class were auto-generated via the command doctrine:generate:entites , I just did the attributes and mappings beforehand. 每个类上的方法都是通过doctrine:generate:entites命令自动生成的,我只是事先进行了属性和映射。

Then when I try to create the tables with doctrine:schema:update --dump-sql it doesn't try to create the articles_tags relationship: 然后,当我尝试使用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);

Why doesn't it try to create the addTag & etc. methods on Article.php? 为什么不尝试在addTag上创建addTag等方法? And why it doesn't try to create the ManyToMany joinTable? 为什么不尝试创建ManyToMany joinTable?

Have you tried adding join columns? 您是否尝试添加联接列? Maybe it helps. 也许有帮助。

/**
 * @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;

Also, it seems you have added the tags later and forgot to call the generate entities again because I can't find getters and setters for tags in your code. 另外,似乎您后来添加了标签,却忘记了再次调用generate实体,因为我在代码中找不到标签的getter和setter方法。 Try to run the doctrine:generate:entites again. 尝试再次运行doctrine:generate:entites

Lastly, have you checked that your database doesn't already have that table present? 最后,您是否检查过数据库中没有该表? (This shouldn't be possible, but it doesn't hurt to check if you don't have any other ideas.) (这是不可能的,但是检查您是否没有其他想法也没有关系。)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM