2017-01-11 3 views
1

J'ai trois entités simples: RecipeEntity, IngredientEntity et FoodEntity.doctrine oneToOne unidirectionnel: objet mappé

Comme je comprends les associations de doctrine correctement RecipeEntity devrait avoir une relation bidirectionnelle OneToMany -IngredientEntity comme une recette contient de nombreux ingrédients. Un ingrédient contient exactement un aliment, donc je suppose une association unidirectionnelle de l'ingrédient à la nourriture. En tant qu'ID, j'ai Uuids au lieu d'entiers utilisant une bibliothèque tierce, ce qui fonctionne généralement bien.

Maintenant, j'ai ma base de données SQL rempli avec une recette pointant vers des ingrédients pointant vers la nourriture. Lorsque j'appelle une recette, je peux récupérer les ingrédients. Tout en faisant défiler les ingrédients, je peux accéder à la recette (bidirectionnelle association) comme un objet.

Mais, quand je veux accéder à la nourriture, je ne suis pas un objet FoodEntity comme je l'aurais prévu, mais seulement l'id de la nourriture (qui est lui-même un objet à cause de la bibliothèque UUID qui est utilisé). Pourquoi n'ai-je pas d'objet FoodEntity? Qu'est-ce qui ne va pas? J'espère que je me suis fait comprendre! Merci pour votre aide.

Cheers, LT.

C'est ce que je (réduit pour une meilleure lisibilité):

/** 
* Class RecipeEntity 
* 
* @ORM\Entity(repositoryClass="RecipeRepository") 
* @ORM\Table(name="recipe") 
* 
*/ 
class RecipeEntity implements ArraySerializableInterface 
{ 
    /** 
    * @ORM\Column(name="id", type="uuid") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="UUID") 
    */ 
    private $id; 

    /** 
    * @ORM\OneToMany(targetEntity="IngredientEntity", mappedBy="recipe") 
     */ 
    private $ingredients; 

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

    /** 
    * @return Collection 
    */ 
    public function getIngredients() 
    { 
     return $this->ingredients; 
    } 
} 

/** 
* Class IngredientEntity 
* 
* @ORM\Entity 
* @ORM\Table(name="ingredient", indexes={@ORM\Index(name="recipe_id", columns={"recipe_id"}), @ORM\Index(name="food_id", columns={"food_id"})}) 
*/ 
class IngredientEntity implements ArraySerializableInterface 
{ 
    /** 
    * @ORM\Column(name="id", type="uuid") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="UUID") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(name="recipe_id", type="uuid") 
    * @ORM\ManyToOne(targetEntity="RecipeEntity", inversedBy="ingredients") 
    */ 
    private $recipe; 

    /** 
    * @ORM\Column(name="food_id", type="uuid") 
    * @ORM\OneToOne(targetEntity="FoodEntity") 
    */ 
    private $food; 
} 

/** 
* Class FoodEntity 
* 
* @ORM\Table(name="food", indexes={@ORM\Index(name="source_id", columns={"source_id"})}) 
* @ORM\Entity(repositoryClass="LT\Model\Repository\FoodRepository") 
*/ 
class FoodEntity implements ArraySerializableInterface 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="id", type="uuid") 
    * @ORM\GeneratedValue(strategy="UUID") 
    */ 
    private $id; 
} 

Répondre

1

L'erreur que vous faites est que vous ajoutez à la fois @Column ainsi que @OneToOne (dans le cas de la nourriture) et @ManyToOne (en cas de recette) . Une propriété est soit une relation/association ou un champ/colonne, pas les deux.

Vous devez supprimer vos annotations @Column des associations dans vos définitions d'entité.

/** 
* Class IngredientEntity 
* 
* @ORM\Entity 
* @ORM\Table(name="ingredient", indexes={@ORM\Index(name="recipe_id", columns={"recipe_id"}), @ORM\Index(name="food_id", columns={"food_id"})}) 
*/ 
class IngredientEntity implements ArraySerializableInterface 
{ 
    /** 
    * @ORM\Column(name="id", type="uuid") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="UUID") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="RecipeEntity", inversedBy="ingredients") 
    */ 
    private $recipe; 

    /** 
    * @ORM\OneToOne(targetEntity="FoodEntity") 
    */ 
    private $food; 
} 
+0

Merci Wilt, mille fois, qui fait l'affaire !!! – Lowtower

+0

Le point exact !!! –

+0

@Lowtower Vous êtes les bienvenus. – Wilt