【问题标题】:Symfony2 and doctrine: multiple relationships between two classesSymfony2 和教义:两个类之间的多重关系
【发布时间】:2014-08-31 15:45:59
【问题描述】:

我是 Symfony2 和 Doctrine 的新手。
我有两个类:用户和书籍。每个用户都可以非常喜欢、非常喜欢或不喜欢数据库中的每一本书。

为了描述这种关联,我在两个类之间定义了三种不同的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

我收到以下错误:

[Doctrine\DBAL\Schema\SchemaException]
名称为“XXX/myproject/app/data/users.user_book”的表已存在。



实际上,我什至不明白我是否以错误的方式描述了这种关系,或者学说是否无法管理两个阶级之间的多重关系。
有人有什么建议吗?
提前致谢!

【问题讨论】:

  • 这实际上是一个很好的问题,可能会对许多其他开发人员有所启发。

标签: php symfony doctrine-orm


【解决方案1】:

Doctrine 确实可以管理多种关系。典型的例子是用户和角色之间。这里的问题是您试图在相同的两个实体之间创建多个多对多关系。 Doctrine 将如何管理这些关系是使用约定 table1_table2 或在您的情况下为“user_book”创建一个“连接”表。所以你得到 Doctrine 错误的原因表面上是因为它试图创建同一个表 3 次。

我认为你想要做的是有 3 个独立的多对多“连接”表,一个用于 likemuch、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

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多