2014-08-31 68 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