2014-08-31 69 views
3

我是Symfony2和Doctrine的新手。
我有两个类:用户和书。每个用户都可以非常喜欢,甚至不喜欢数据库中的每本书。
Symfony2和原理:两个类之间的多重关系

为了描述这种关联,我定义了两个类之间的三个不同ManyToMany关系。 这里是我的代码的摘录:

这里是一流的用户

<?php 

namespace MyBundle\Entity; 

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

/** 
* User 
* 
* @ORM\Table(name="user") 
* @ORM\Entity(repositoryClass="MyBundle\Entity\UserRepository") 
*/ 
class User 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="username", type="string", length=64, unique=true) 
    */ 
    private $username; 

    /** 
    * @ORM\ManyToMany(targetEntity="Book", inversedBy="user_likemuch") 
    * @ORM\JoinColumn(name="book_id", referencedColumnName="id") 
    */ 
    protected $books_likemuch; 

    /** 
    * @ORM\ManyToMany(targetEntity="Book", inversedBy="user_likequite") 
    * @ORM\JoinColumn(name="book_id", referencedColumnName="id") 
    */ 
    protected $books_likequite; 

    /** 
    * @ORM\ManyToMany(targetEntity="Book", inversedBy="user_dislike") 
    * @ORM\JoinColumn(name="book_id", referencedColumnName="id") 
    */ 
    protected $books_dislike; 

    public function __construct() 
    { 
     $this->books_likemuch = new ArrayCollection(); 
     $this->books_likequite = new ArrayCollection(); 
     $this->books_dislike = new ArrayCollection(); 

    } 

} 


这里是类图书:

<?php 

namespace MyBundle\Entity; 

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

/** 
* Book 
* 
* @ORM\Table(name="book") 
* @ORM\Entity(repositoryClass="MyBundle\Entity\BookRepository") 
*/ 
class Book 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

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

    /** 
    * @ORM\ManyToMany(targetEntity="User", mappedBy="books_likemuch") 
    */ 
    protected $user_likemuch; 

    /** 
    * @ORM\ManyToMany(targetEntity="User", mappedBy="books_likequite") 
    */ 
    protected $user_likequite; 

    /** 
    * @ORM\ManyToMany(targetEntity="User", mappedBy="books_dislike") 
    */ 
    protected $user_dislike; 


    public function __construct() { 
     $this->user_likemuch = new ArrayCollection(); 
     $this->user_likequite = new ArrayCollection(); 
     $this->user_dislike = new ArrayCollection(); 
    } 

} 


然而,当我尝试通过

01来更新数据库的模式
php app/console doctrine:schema:update --force 

我得到以下错误:

[主义\ DBAL \架构\ SchemaException]
与名称表 'XXX/myproject的/应用程序/数据/ users.user_book' 已经存在。



事实上,我甚至不明白,如果我的描述错误的方式的关系,或者如果学说不能在两个类之间管理多个关系。
有没有人有任何建议?
在此先感谢!

+0

这实际上是一个很大的问题,可能会是有益的很多其他的开发商。 – 2014-08-31 16:21:27

回答

3

主义确实可以管理多种关系。典型的例子是在用户和角色之间。这里的问题是你试图在相同的两个实体之间创建多个ManyToMany关系。管理这些关系需要做的是使用约定table1_table2创建一个“连接”表,或者在你的例子“user_book”中创建一个“连接”表。所以你得到Doctrine错误的原因表面上是因为它试图创建相同的表3次。

我想你想要做的是有3个独立的ManyToMany“加入”表,其中一个用于likemch,likequite和dislike。因此,请尝试为每个关联指定连接表并查看是否有帮助。例如:

/** 
* @ORM\ManyToMany(targetEntity="Book", inversedBy="user_likemuch") 
* @ORM\JoinColumn(name="book_id", referencedColumnName="id") 
* @ORM\JoinTable(name="user_book_likemuch") 
*/ 
protected $books_likemuch; 

为多对多的关系参见双向关联映射的部分:Doctrine Association Mapping

+0

是的!这对我有用! – Alberto 2014-08-31 17:02:37