在我的Symfony2项目中,我有两个相关的实体:用户和收藏夹。他们有多对多的关系。
我的申请表如下: 在我的Twig页面中,我有一些带有“添加到收藏夹”按钮的项目。当您单击按钮时,我的控制器将item_id保存在“收藏夹”列中。但后来我想保存 将项目添加到他的收藏夹的用户,此处我的应用程序失败。
用户和收藏夹存在但用户和收藏夹之间的连接列仍为空。 我也没有收到任何错误。
这是我的代码:
实体用户
class Users implements AdvancedUserInterface
{
/**
* @var \Doctrine\Common\Collections\ArrayCollection
*
* @ORM\ManyToMany(targetEntity="Favorites", inversedBy="user", cascade={"persist"})
* @ORM\JoinTable(name="user_has_favorite",
* joinColumns={
* @ORM\JoinColumn(name="user_id", referencedColumnName="user_id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="favorite_id", referencedColumnName="favorite_id")
* }
* )
*/
private $favorite;
public function __construct()
{
$this->favorite = new \Doctrine\Common\Collections\ArrayCollection();
}
public function addFavorite(\Geo\CityTroopersBundle\Entity\Favorites $favorite)
{
$this->favorite[] = $favorite;
return $this;
}
...
实体收藏夹
class Favorites
{
/**
* @var \Doctrine\Common\Collections\ArrayCollection
*
* @ORM\ManyToMany(targetEntity="Users", mappedBy="favorite", cascade={"persist"})
*/
private $user;
public function __construct()
{
$this->user = new \Doctrine\Common\Collections\ArrayCollection();
}
public function addUser(\Geo\CityTroopersBundle\Entity\Users $user)
{
$this->user[] = $user;
return $this;
}
我的控制器
public function showNewsAction()
{
$request = $this->get('request');
$itemId=$request->request->get('itemId');
if($itemId != NULL)
{
//MAKE NEW FAVORITE AND ADD TO DATABASE LINKED WITH ITEM
$favorite = new Favorites();
$favorite->setItemId($itemId);
//LINK FAVORITE ID WITH USER ID IN JOINCOLUMN
$userId = 6;
$em = $this->getDoctrine()->getEntityManager();
$user = $em->getRepository('GeoCityTroopersBundle:Users')->find($userId);
$favorite->addUser($user);
$em->persist($favorite);
//I TRIED THIS TOO, BUT IT FAILED
/*$user->addFavorite($favorite);
$em->persist($user);*/
$em->flush();
答案 0 :(得分:24)
你在那附近。对于doctrine多对多关系,您需要调用两个add方法
$favorite->addUser($user);
$user->addFavorite($favorite);
$em->persist($favorite);
$em->persist($user);
$em->flush();
这应该可以解决问题。在the docs他们这样做,但没有明确提及。不确定为什么会因为很多人遇到这种情况(包括我自己)。
答案 1 :(得分:8)
如此处所述,只有拥有方负责连接管理: http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html#owning-and-inverse-side-on-a-manytomany-association
所以只有
$user->addFavorite($favorite);
应该坚持,而不是
$favorite->addUser($user);
答案 2 :(得分:0)
如同Cedric所指出的那样,添加多对多关系的记录只能在一个方向上完成,这取决于你如何定义关系:只能通过关系的父实体进行添加,所以在你的情况下你必须使用:
"C:\Windows\System32"
答案 3 :(得分:0)
在你的行中:
@ORM\JoinColumn(name="favorite_id", referencedColumnName="favorite_id")
在
name="favorite_id"
part指的是连接表中的列,而
referencedColumnName="favorite_id"
指的是喜欢的表中的id,通常只是“id”。你应该试试:
/**
* @var \Doctrine\Common\Collections\ArrayCollection
*
* @ORM\ManyToMany(targetEntity="Favorites", inversedBy="user", cascade={"persist"})
* @ORM\JoinTable(name="user_has_favorite",
* joinColumns={
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="favorite_id", referencedColumnName="id")
* }
* )
*/
private $favorite;