简体   繁体   中英

Doctrine2 Association for ManyToMany Bidirectional and Insert operation for Unique OneToMany Relationships

I am using Symfony2 with Doctrine 2 . I have 5 entities in my application.

  1. Book
  2. Keyword (Bidirectional, should fetch all books having particular keyword)
  3. Author (Bidirectional, should fetch all books having particular author(s))
  4. Category (Bidirectional, should fetch all books falling into particular category)
  5. BookExtra (Unidirectional, In Book Entity, should fetch BookExtra data)

    • Each book can have many keywords
    • Each book can have many authors
    • Each book can fall into a single category
    • Each book have exactly one BookExtra record.
    • The keyword and author tables should contain unique values

When a new Book is added, if the Author(s) and Keyword(s) exists, the respected Author ID and Keyword ID should be assigned to the Book , and if it doesn't exist, the new records will be created and the respected ID should be assigned to the Book .

I have the following 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 Entities are similar to Author Entity

The Problem is that, when i generate schema with cli , it never generates Relationships/Associations .

And what should be the proper Relationships/Associations for Book & Author Entity

I searched for this problem and proper Relationships/Associations

I found this:

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?

But it didn't help me.

Can somebody give an example of this type of Relationships/Associations and insert operations?

For author->books:

/**
 * @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;

For books->authors

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

See http://docs.doctrine-project.org/en/latest/reference/association-mapping.html#many-to-many-bidirectional for documentation of many-to-many

See http://docs.doctrine-project.org/en/latest/reference/association-mapping.html for full documentation of associations

EDIT

Is assume all your entities will have setters and getters.

// 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);

The addBook and addAuthor will look like this:

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

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

And add a constructor to both the author and book entities:

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

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

Have a look at the documentation to see more examples: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM