2014-08-31 6 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(); 
    } 

} 


Однако, когда я пытаюсь обновить схему базы данных до

php app/console doctrine:schema:update --force 

Я получаю следующее сообщение об ошибке:

[Учение \ DBAL \ Схемы \ SchemaException]
таблица с именем уже существует 'XXX/MyProject/приложение/данные/users.user_book.



На самом деле, я даже не понимаю, если я описывая отношения в неправильном направлении, или если доктрина не может управлять несколько отношений между двумя классами.
Есть ли у кого-нибудь предложения?
Заранее благодарим!

+0

Это на самом деле большой вопрос, и, вероятно, будет полезно много других разработчиков. –

ответ

3

Doctrine действительно может управлять несколькими отношениями. Классический пример - между пользователями и ролями. Проблема здесь в том, что вы пытаетесь создать несколько отношений ManyToMany между теми же двумя объектами. Что Doctrine сделает для управления этими отношениями, создайте таблицу «join», используя таблицу table1_table2, или в вашем случае «user_book». Поэтому причина, по которой вы получаете ошибку Doctrine, якобы потому, что она пытается создать ту же таблицу 3 раза.

Я думаю, что вы хотите сделать, есть 3 отдельных ManyToMany «присоединиться» к столам, один для likemuch, likequite и не нравится. Поэтому попробуйте указать таблицу соединений для каждой ассоциации и посмотреть, поможет ли это. Пример:

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

Смотрите раздел двунаправленного отображения ассоциации для ManyToMany отношений: Doctrine Association Mapping

+0

Да! Это сработало для меня! – Alberto

Смежные вопросы