symfony 2固定装置,用于多对多关系

时间:2015-01-02 03:07:12

标签: php symfony doctrine-orm many-to-many fixtures

如何为多个关系设置symfony 2的灯具, 以下2个实体由命令行生成, 然后为多对多关系添加了一些行

实体1:博客课程

<?php

namespace Acme\MainBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * Blog
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Acme\MainBundle\Entity\BlogRepository")
*/
 class Blog {

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\ManyToMany(targetEntity="tag", inversedBy="blogs")
 * @ORM\JoinTable(name="blog_tag",
 *      joinColumns={@ORM\JoinColumn(name="blog_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")}
 *      )
 **/
protected $tags;

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


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

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

/**
 * @var string
 *
 * @ORM\Column(name="author", type="string", length=255)
 */

private $author;

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

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

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

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

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

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

    return $this;
}

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

/**
 * Set author
 *
 * @param string $author
 * @return Blog
 */
public function setAuthor($author) {
    $this->author = $author;

    return $this;
}

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

/**
 * Set createdAt
 *
 * @param \DateTime $createdAt
 * @return Blog
 */
public function setCreatedAt($createdAt) {
    $this->createdAt = $createdAt;

    return $this;
}

/**
 * Get createdAt
 *
 * @return \DateTime 
 */
public function getCreatedAt() {
    return $this->createdAt;
}

/**
 * Set updatedAt
 *
 * @param \DateTime $updatedAt
 * @return Blog
 */
public function setUpdatedAt($updatedAt) {
    $this->updatedAt = $updatedAt;

    return $this;
}

/**
 * Get updatedAt
 *
 * @return \DateTime 
 */
public function getUpdatedAt() {
    return $this->updatedAt;
}

/**
 * Set content
 *
 * @param string $content
 * @return Blog
 */
public function setContent($content) {
    $this->content = $content;

    return $this;
}

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

/**
 * Set isPublished
 *
 * @param boolean $isPublished
 * @return Blog
 */
public function setIsPublished($isPublished) {
    $this->isPublished = $isPublished;

    return $this;
}

/**
 * Get isPublished
 *
 * @return boolean 
 */
public function getIsPublished() {
    return $this->isPublished;
}

public function __toString() {
    return strval($this->id);
}


/**
 * Set subTitle
 *
 * @param string $subTitle
 * @return Blog
 */
public function setSubTitle($subTitle)
{
    $this->subTitle = $subTitle;

    return $this;
}

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

/**
 * Add tags
 *
 * @param \Acme\MainBundle\Entity\tag $tags
 * @return Blog
 */
public function addTag(\Acme\MainBundle\Entity\tag $tags)
{
    $this->tags[] = $tags;
    $tags->addBlog($this);

    return $this;
}

/**
 * Remove tags
 *
 * @param \Acme\MainBundle\Entity\tag $tags
 */
public function removeTag(\Acme\MainBundle\Entity\tag $tags)
{
    $this->tags->removeElement($tags);
}

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

实体2:代码类

<?php

namespace Acme\MainBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * Tag
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Acme\MainBundle\Entity\TagRepository")
 */
class Tag {

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\ManyToMany(targetEntity="blog", mappedBy="tags")
 **/

protected $blogs;

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

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

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

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

    return $this;
}

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

/**
 * Set isPublished
 *
 * @param boolean $isPublished
 * @return Tag
 */
public function setIsPublished($isPublished) {
    $this->isPublished = $isPublished;

    return $this;
}

/**
 * Get isPublished
 *
 * @return boolean 
 */
public function getIsPublished() {
    return $this->isPublished;
}

public function __toString() {
    return strval($this->id);
}

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

/**
 * Add blogs
 *
 * @param \Acme\MainBundle\Entity\blog $blogs
 * @return Tag
 */
public function addBlog(\Acme\MainBundle\Entity\blog $blogs)
{
    $this->blogs[] = $blogs;
    $blogs->addTag($this);


    return $this;
}

/**
 * Remove blogs
 *
 * @param \Acme\MainBundle\Entity\blog $blogs
 */
public function removeBlog(\Acme\MainBundle\Entity\blog $blogs)
{
    $this->blogs->removeElement($blogs);
}

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

2 个答案:

答案 0 :(得分:8)

<强>注意!!!

你的代码中有一个循环引用! 当您向博客添加标签时,它会将博客添加到标签等等,请按以下方式修复:

<强>博客

/**
 * Add tags
 *
 * @param \Acme\MainBundle\Entity\tag $tags
 * @return Blog
 */
public function addTag(\Acme\MainBundle\Entity\tag $tags)
{
    if (!$this->tags->contains($tags))
    {
        $this->tags[] = $tags;
        $tags->addBlog($this);
    }

    return $this;
}

代码

/**
 * Add blogs
 *
 * @param \Acme\MainBundle\Entity\blog $blogs
 * @return Tag
 */
public function addBlog(\Acme\MainBundle\Entity\blog $blogs)
{
    if (!$this->blogs->contains($blogs))
    {
        $this->blogs[] = $blogs;
        $blogs->addTag($this);
    }


    return $this;
}

对于您的问题:

首先,安装并配置DoctrineFixturesBundle。 使用订购的夹具功能首先加载标签然后加载博客。

然后我为你写这个例子灯具:

TagFixtures

<?php

namespace Acme\MainBundle\DataFixtures\ORM;

use Acme\MainBundle Bundle\Entity\Tag;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;

class TagFixtures  extends AbstractFixture implements OrderedFixtureInterface {

    /**
     * Load data fixtures with the passed EntityManager
     *
     * @param \Doctrine\Common\Persistence\ObjectManager $manager
     */
    function load(ObjectManager $manager)
    {
        $tag1 = new Tag();
        $tag1->setTag("tag name 1");
        $tag1->setIsPublished(true);

        $tag2 = new Tag();
        $tag2->setTag("tag name 2");
        $tag2->setIsPublished(true);

        $manager->persist($tag1);
        $manager->persist($tag2);
        $this->addReference('tag-tag_1', $tag1);
        $this->addReference('tag-tag_2', $tag2);

        $manager->flush();

    }

    /**
     * Get the order of this fixture
     *
     * @return integer
     */
    function getOrder()
    {
        return 1;
    }
}

<强> BlogFixtures

<?php

namespace Acme\MainBundle\DataFixtures\ORM;

use Acme\MainBundle\Entity\Blog;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;

class BlogFixtures  extends AbstractFixture implements OrderedFixtureInterface {

    /**
     * Load data fixtures with the passed EntityManager
     *
     * @param \Doctrine\Common\Persistence\ObjectManager $manager
     */
    function load(ObjectManager $manager)
    {

        $blog = new Blog();
        $blog->setTitle('Happy new year');
        $blog->setAuthor("me");
        $blog->setIsPublished(true);
        $blog->setContent("Happy new year");
        $blog->setSubTitle("2015");
        $blog->setCreatedAt(new \DateTime('now'));
        $blog->setUpdatedAt(new \DateTime('now'));

        $blog->addTag($this->getReference('tag-tag_1'));
//        $blog->addTag($this->getReference('tag-tag_2'));

        $manager->persist($blog);
//        $this->addReference('blog-blog_1', $blog);

        $manager->flush();

    }

    /**
     * Get the order of this fixture
     *
     * @return integer
     */
    function getOrder()
    {
        return 2;
    }
}

希望这有助于新年快乐!

答案 1 :(得分:1)

对于简单的情况,我创建我的灯具,如:

的Acme / DemoBundle /实体/ Tag.php

public function addBlog(\Acme\MainBundle\Entity\blog $blog)
{
    $this->blogs[] = $blog;

    return $this;
}

的Acme / DemoBundle /实体/ blog.php的

public function addTag(\Acme\MainBundle\Entity\tag $tags)
{
    $this->tags[] = $tags;
    $tags->addBlog($this);

    return $this;
}

的Acme / DemoBundle / DataFixtures / ORM / TagBlogFixture.php

class TagBlogFixture extends AbstractFixture implements OrderedFixtureInterface {
    function load(ObjectManager $manager)
    {
        $tag1 = new Tag();
        // setters

        $tag2 = new Tag();
        // setters

        $blog1 = new Blog();
        // setters

        $blog1
            ->addTag($tag1)
            ->addTag($tag2)
        ;

        $blog2 = new Blog();
        // setters

        $blog2->addTag($tag2);

        $manager->persist($tag1);
        $manager->persist($tag2);
        $manager->persist($blog1);
        $manager->persist($blog2);

        $manager->flush();
    }

    function getOrder()
    {
        return 1;
    }
}

这并不共享对象之间的任何引用,而是在单个文件中创建它们。