gristoi Posted November 22, 2012 Share Posted November 22, 2012 (edited) So, I have been playing round with using doctrine for a while now and have it in some basic projects, but i decided to go back and have an in depth look into what it can do. Ive now decided to switch to symfony 2 as my framework of choice and am looking into what doctrine 2 can do in more depth. One thing i have been trying to get my head around is the many to many relationship within doctrine. I am starting to build a recipe system and am working on the relation between recipe and ingredients which gave me 3 entities, recipe, recipeIngredient and ingredient. The reason i cannot use a direct many to many relation is because i want to store two additional columns in the join table ( unit and quantity ) for each ingredient. The problem i am having at the moment is that the entities persist ok, but the recipe_id in the join table is not inserted. The ingredient saves fine and the ingredient_id is stored as expected. I have tried everything i can think off and been through every thread and website looking for an answer . I am sure it is something completely obvious that i am missing. Please help, below is the code i have so far: <?php namespace Recipe\RecipeBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * @ORM\Entity * @ORM\Table(name="recipe") * @ORM\HasLifecycleCallbacks() */ class Recipe{ /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\OneToMany(targetEntity="RecipeIngredient", mappedBy="recipe", cascade= {"persist"}) */ protected $ingredients; /** * @ORM\Column(type="string") * @var string $title * */ protected $title; /** * Constructor */ public function __construct() { $this->ingredients = new \Doctrine\Common\Collections\ArrayCollection(); } /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Add ingredients * * @param \Recipe\RecipeBundle\Entity\RecipeIngredient $ingredients * @return Recipe */ public function addIngredient(\Recipe\RecipeBundle\Entity\RecipeIngredient $ingredients) { $ingredients->setRecipe($this); $this->ingredients[] = $ingredients; return $this; } /** * Remove ingredients * * @param \Recipe\RecipeBundle\Entity\RecipeIngredient $ingredients */ public function removeIngredient(\Recipe\RecipeBundle\Entity\RecipeIngredient $ingredients) { $this->ingredients->removeElement($ingredients); } /** * Get ingredients * * @return \Doctrine\Common\Collections\Collection */ public function getIngredients() { return $this->ingredients; } /** * Set title * * @param string $title * @return Recipe */ public function setTitle($title) { $this->title = $title; return $this; } /** * Get title * * @return string */ public function getTitle() { return $this->title; } } and recipeIngredient /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\ManyToOne(targetEntity="Recipe", inversedBy="ingredients") * */ protected $recipe; /** * @ORM\ManyToOne(targetEntity="Ingredient", inversedBy="ingredients" , cascade={"persist"}) * */ protected $ingredient; /** * @ORM\Column(type="string") * @var string $quantity * */ protected $quantity; /** * @ORM\Column(type="string") * @var string $unit * */ protected $unit; /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set quantity * * @param string $quantity * @return RecipeIngredient */ public function setQuantity($quantity) { $this->quantity = $quantity; return $this; } /** * Get quantity * * @return string */ public function getQuantity() { return $this->quantity; } /** * Set unit * * @param string $unit * @return RecipeIngredient */ public function setUnit($unit) { $this->unit = $unit; return $this; } /** * Get unit * * @return string */ public function getUnit() { return $this->unit; } /** * Set recipe * * @param \Recipe\RecipeBundle\Entity\Recipe $recipe * @return RecipeIngredient */ public function setRecipe(\Recipe\RecipeBundle\Entity\Recipe $recipe = null) { $this->recipe = $recipe; return $this; } /** * Get recipe * * @return \Recipe\RecipeBundle\Entity\Recipe */ public function getRecipe() { return $this->recipe; } /** * Set ingredient * * @param \Recipe\RecipeBundle\Entity\Ingredient $ingredient * @return RecipeIngredient */ public function setIngredient(\Recipe\RecipeBundle\Entity\Ingredient $ingredient = null) { $this->ingredient = $ingredient; return $this; } /** * Get ingredient * * @return \Recipe\RecipeBundle\Entity\Ingredient */ public function getIngredient() { return $this->ingredient; } } Edited November 22, 2012 by gristoi Quote Link to comment https://forums.phpfreaks.com/topic/271022-help-needed-with-doctrine-2-many-to-many-relation-with-additional-columns-in-join-table/ Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.