如何在Symfony 2和Doctrine中关联实体?

时间:2012-04-24 17:04:29

标签: php symfony

如何在Symfony 2和Doctrine的实体之间创建关系?我只能创建独立的实体。也许有人可以帮助我使用实体生成器解决这个问题?我想:

  • 创建两个实体:帖子和类别。帖子是类别的一部分。
  • 创建标记实体:帖子可以包含许多标记。

2 个答案:

答案 0 :(得分:3)

这里的Symfony2文档中包含一个实际示例:

http://symfony.com/doc/current/book/doctrine.html#entity-relationships-associations

详细说明一下,在第一个示例中,您需要在OneToMany对象与Category对象之间建立Post关系:

Category.php:

<?php

namespace Your\CustomBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

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

    /**
     * @ORM\OneToMany(targetEntity="Post", mappedBy="category")
     */
    public $posts;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->posts = new ArrayCollection();
    }

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

post.php中

<?php

namespace Your\CustomBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

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

    /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="posts")
     */
    public $category;

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

这应该让你开始。我刚刚写了这个,所以可能有错误:s

为了简洁,我在这里公开了$posts$category个属性; 但是你可能会建议你将这些私有化,并在你的课程中加入setter / getters

另请注意,$posts是一个类似于数组的Doctrine ArrayObject类,尤其适用于使用$category->posts->add($post)等方法来聚合实体。

有关详细信息,请查看Doctrine文档中的关联映射。您可能需要在ManyToManyPosts之间设置Tags关系。

希望这会有所帮助:)

答案 1 :(得分:0)

您不会与实体生成器本身建立关系。

一旦实体类本身存在(使用实体生成器创建或手工编写),然后编辑它们以添加关系。

例如,您的帖子有很多标签示例

namespace Your\Bundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Your\Bundle\Entity\Post
 *
 * @ORM\Table(name="post")
 * @ORM\Entity
 */
class Post
{
  /**
   * @var \Doctrine\ORM\PersistentCollection
   *
   * @ORM\OneToMany(targetEntity="Tag", mappedBy="post", cascade={"persist"})
   */
  private $tags;
}

有关指定关系的详细信息,请参阅Doctrine's Documentation