这个问题是关于使用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()
感谢您的帮助。
答案 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
中找到所有这些信息