【问题标题】:Doctrine2 Association for ManyToMany Bidirectional and Insert operation for Unique OneToMany Relationships多对多双向的 Doctrine2 关联和唯一一对多关系的插入操作
【发布时间】:2025-06-19 12:25:01
【问题描述】:

我正在使用 Symfony2Doctrine 2。 我的应用程序中有 5 个实体。

  1. 书籍
  2. 关键字(双向,应获取所有具有特定关键字的书籍)
  3. 作者(双向,应获取具有特定作者的所有书籍)
  4. 类别(双向,应获取属于特定类别的所有书籍)
  5. BookExtra(单向,在 Book 实体中,应该获取 BookExtra 数据)

    • 每本书可以有很多关键词
    • 每本书可以有多个作者
    • 每本书都可以归为一个类别
    • 每本书都有一个 BookExtra 记录。
    • 关键字和作者表应包含唯一值

添加新的Book 时,如果Author(s)Keyword(s) 存在,则应将尊重的Author IDKeyword ID 分配给Book,如果不存在,则将创建新的records,并将受尊重的ID 分配给Book

我有以下Entity Classes

Book.php

namespace Acme\StoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Book
 *
 * @ORM\Table(name="book")
 * @ORM\Entity
 */
class Book {

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @var string
 *
 * @ORM\Column(name="isbn", type="string", length=16)
 */
protected $isbn;

/**
 * @var string
 *
 * @ORM\Column(name="title", type="string", length=255)
 */
protected $title;

/*
 * @ORM\OneToOne(targetEntity="BookExtra")
 * @ORM\JoinColumn(name="extra_id", referencedColumnName="id")
 *
 *   *********         OR        *********
 *   *********What should go HERE*********
 *
 */
protected $bookextra;

/*
 * @ORM\ManyToMany(targetEntity="Author", inversedBy="books")
 * @ORM\JoinTable(name="authors_books")
 */
protected $author;

/*
 * @ORM\OneToOne(targetEntity="Category")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
 */
protected $category;

}

BookExtra.php

namespace Acme\StoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * BookExtra
 *
 * @ORM\Table(name="book_extra")
 * @ORM\Entity
 */
class Detail {

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @var string
 *
 * @ORM\Column(name="data", type="string", length=255)
 */
protected $data;

}

Author.php

namespace Bookhut\BookBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Author
 *
 * @ORM\Table(name="author")
 * @ORM\Entity
 */
class Author {

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

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

// **********What should go HERE*********
protected $books;

}

Keyword & Category 实体类似于作者实体

问题是,当我用cli 生成schema 时,它永远不会生成Relationships/Associations

对于Book & Author 实体,正确的Relationships/Associations 应该是什么

我搜索了这个问题和正确的Relationships/Associations

我发现了这个:

Symfony2 app/console not generating properties or schema updates for Entity Relationships/Associations

Saving onetoone relation entities

doctrine2: in a one-to-many bidirectional relationship, how to save from the inverse side?

但这对我没有帮助。

有人可以举例说明这种Relationships/Associationsinsert 操作吗?

【问题讨论】:

    标签: entity-framework symfony doctrine-orm relational-database


    【解决方案1】:

    对于作者->书籍:

    /**
     * @ManyToMany(targetEntity="Author", inversedBy="books")
     * @JoinTable(name="authors_books",
     *     joinColumns={@JoinColumn(name="book_id", referencedColumnName="id")},
     *     inverseJoinColumns={@JoinColumn(name="author_id", referencedColumnName="id")}
     * )
     */
    protected $author;
    

    对于书籍->作者

    /**
     * @ManyToMany(targetEntity="Book", mappedBy="author")
     */
    protected $books;
    

    有关多对多的文档,请参阅 http://docs.doctrine-project.org/en/latest/reference/association-mapping.html#many-to-many-bidirectional

    有关关联的完整文档,请参阅 http://docs.doctrine-project.org/en/latest/reference/association-mapping.html

    编辑

    假设您的所有实体都有 setter 和 getter。

    // Create new Author object
    $Author = new Author();
    // Use setters to set all attributes for this author
    
    // Create new book
    $Book = new Book();
    // Use setters to set all attributes for book
    
    // Attach book to author
    $Author->addBook($Book);
    $Book->addAuthor($Author);
    

    addBook 和 addAuthor 将如下所示:

    // Inside author entity
    public function addBook(Book $Book) {
        $this->books->add($Book);
    }
    
    // Inside book entity
    public function addAuthor($Author) {
        $this->authors->add($Author);
    }
    

    并为作者和书籍实体添加一个构造函数:

    public function __construct() {
        $this->books = new ArrayCollection();
    }
    
    public function __construct() {
        $this->authors = new ArrayCollection();
    }
    

    查看文档以查看更多示例: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html

    【讨论】:

    • 谢谢,您能否提供一个在作者表中添加唯一记录以使其仅包含唯一记录的示例?如果同一作者的另一本书将被分配到他们尊重的 ID(我已经在问题中描述过)
    最近更新 更多