Kapil Sharma
Kapil Sharma

Reputation: 10417

Correct Symfony-doctrine inheritance mapping

I recently started using Symfony2-Doctrine2. I'm not getting how to save data in inheritance mapping.

My requirements:

For learning exercise:

To quickly visualize, I've following structure:

enter image description here

I achieved above structure as per doctrine docs for inheritance mapping & Bidirectional one to many relation

My Question: How to save data using Symfony2 (I've proper routing/actions running, just need code to write in controller or better in repository). While saving data (say for manual) I want to save data in Item, Manual and ItemContect table but getting confused due to discr field in database. I didn't find code for saving data in above structure. I don't need full code, just few hints will be sufficient. My Item class is as follow (Other classes have proper inverse as mentioned in doctrine docs):

/**
 * Article
 *
 * @ORM\Table(name="item")
 * @ORM\Entity(repositoryClass="Test\LibraryBundle\Entity\ItemRepository")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"book" = "Book", "manual" = "Manual", "article" =  "Article"})
 */
class Item
{
    //...

    /**
     *  For joining with ItemContent
     * 
     * @ORM\OneToMany(targetEntity="ItemContent", mappedBy="item")
     **/
    private $itemContents; 

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

    //...
}

Upvotes: 1

Views: 831

Answers (1)

Vincent Barrault
Vincent Barrault

Reputation: 2914

The discriminator field will be automatically filled by Doctrine

$em = $this->getDoctrine()->getManager();
$item = new Manual(); // discr field = "manual"
$itemContent = new ItemContent();

$item->addItemContent($itemContent);
$itemContent->setItem($item);

$em->persist($item);
$em->persist($itemContent);
$em->flush();

Is that the answer you're waiting ?

Upvotes: 2

Related Questions