Dawid Szyszko
Dawid Szyszko

Reputation: 31

Symfony 2 relations issue

I nead help.

I have 3 entities. Book, Category And BookCategory - book can have multiple categories so i used another table.

I can easily acces Book and Category useing BookCategory table but i dont know how to do this by Book->BookCategory->Category.

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

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="text")
     */
    private $name;

     /**
      * @var Category
      * @ORM\ManyToOne(targetEntity="Category", inversedBy="Category")
      * @ORM\JoinColumn(name="parent", referencedColumnName="id")
      */
    private $parent;

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

     /**
      * @var Book
      * @ORM\ManyToOne(targetEntity="Book", inversedBy="BookCategory")
      * @ORM\JoinColumn(name="book_id", referencedColumnName="id")
      */
    private $bookId;

     /**
      * @var Category
      * @ORM\ManyToOne(targetEntity="Category", inversedBy="BookCategory")
      * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
      */
    private $categoryId;

    /**
     * @var integer
     *
     * @ORM\Column(name="priority", type="integer")
     */
    private $priority;

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

    /**
     * @var string
     *
     * @ORM\Column(name="title", type="text")
     */
    private $title;

    /**
     * @var string
     *
     * @ORM\Column(name="author", type="text")
     */
    private $author;

    /**
     * @var float
     *
     * @ORM\Column(name="price", type="float")
     */
    private $price;

How i need to config my entities or how to make my DQL to achive wanted results?

Upvotes: 0

Views: 59

Answers (1)

TimoStaudinger
TimoStaudinger

Reputation: 42460

With your code, you only established the relationship from BookCategory to Book. As you said, that enables you to get the Book associated to one BookCategory. To go the other way and get all BookCategory that belong to one book, you also need to specify this relationship. What you want is a OneToMany relationship from Book to BookCategory.

<?php

//...
use Doctrine\ORM\Mapping\OneToMany;

class Book
{
    //...

    /**
    * @OneToMany(targetEntity="BookCategory", mappedBy="bookId")
    */
    private $bookCategories;

    //...
}

class BookCategory
{

     //...

     /**
      * @var Book
      * @ORM\ManyToOne(targetEntity="Book", inversedBy="bookCategories")
      * @ORM\JoinColumn(name="book_id", referencedColumnName="id")
      */
    private $bookId;

     //...

}

After adding the necessary getters and setters, getBookCategories() will give you an Array with all BookCategory that belong to the Book.

For more details, have a look at the official Symfony2 documentation: http://symfony.com/doc/current/book/doctrine.html#relationship-mapping-metadata

Edit: Included use statement. Corrected inversedBy property for bookId.

Upvotes: 2

Related Questions