Symfony2在另一个实体中获取实体的实体

时间:2015-10-18 01:37:20

标签: php symfony

这个问题是关于使用ORM的Symfony2表关系。我有三个彼此相关的表/实体。这种关系与Wordpress帖子,类别和类别关系表非常相似。

表1包含帖子。 表2包含类别 表3包含类别和帖子之间的关系。

我希望能够在posts表中使用categories属性,在categories表中使用posts属性。所以当我打电话时。

分类 - >帖子:我应该收到该类别的帖子。 帖子 - >类别:我应该获得帖子所属的类别。

我希望每个表都有唯一的类别,我希望所有帖子都指向一个类别,而不必为已经存在的类别创建一个新条目,这是ManyToOne或OneToMany提供的,这就是我认为的第三个表格的原因是必要的。

例如,这里是关系

class Category_relationship
{

    /**
     * @var integer
     *
     * @ORM\Column(name="object_id", type="bigint")
     *
     * @ORM\ManyToOne(targetEntity="Worksheet",         inversedBy="category_relationships")
     * @ORM\JoinColumn(name="worksheet_id", referencedColumnName="id", nullable=FALSE)
     */
    private $objectId;

    /**
     * @var integer
     *
     * @ORM\Column(name="category_id", type="bigint")
     *
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="categories")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id", nullable=FALSE)
     */
    private $categoryId;

}

这是Category类:

class Category
{
    /**
     * @ORM\OneToMany(targetEntity="Category_relationship", mappedBy="categoryId", cascade={"persist", "remove"}, orphanRemoval=TRUE)
     */
    protected $posts;
}

这是Category类:

class Posts
{    /**
     * @ORM\OneToMany(targetEntity="Category_relationship", mappedBy="objectId", cascade={"persist", "remove"}, orphanRemoval=TRUE)
     */
    protected $categories;
}

我想创建一个系统,我可以在其中为一个类别分配帖子,但类别表只能包含一个关于该类别的条目。我也希望能够使用表达式链接;

后>类别 类别 - >帖子

后> AddCategory() 类别 - > AddPost()

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

似乎你想要一个简单的多对多关系。

每个帖子可以有多个类别,每个类别都有相关帖子列表。许多人自己处理数据透视表。

因此,在Post实体中,您必须以这种方式声明关系:

/**
 * @ORM\ManyToMany(targetEntity="Category", inversedBy="posts")
 * @ORM\JoinTable(name="PostsCategories",
 *      joinColumns={@ORM\JoinColumn(name="post_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id")}
 *      )
 **/
protected $categories;

请记住将Doctrine \ ORM \ Mapping与ORM别名一起使用(您不必单独导入所有子类):

use Doctrine\ORM\Mapping as ORM;

之后,您需要在类构造函数中创建一个新的ArrayCollection:

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

并添加适当的方法,例如addCategory:

public function addCategory(Category $category)
{
    $this->categories[] = $category;

    return $this;
}

您也可以自动添加:

php app/console doctrine:generate:entities BundleName:EntityName

在类别实体中也是如此,但有一点不同的定义:

 /**
 * @ORM\ManyToMany(targetEntity="Post", mappedBy="categories")
 **/
protected $posts;

您可以在Doctrine docs

中找到所有这些信息