У меня есть три простых объекта: RecipeEntity
, IngredientEntity
а также FoodEntity
,
Как я правильно понимаю доктринальные ассоциации RecipeEntity
должен иметь двунаправленный OneToMany отношения с IngredientEntity
как один рецепт содержит много ингредиентов.
Один ингредиент содержит ровно одну еду, поэтому я предполагаю однонаправленный ассоциация от ингредиента к еде.
В качестве идентификаторов я использую Uuids вместо целых чисел, используя стороннюю библиотеку, которая обычно работает нормально.
Теперь моя база данных SQL заполнена рецептом, указывающим на ингредиенты, указывающие на еду.
Когда я вызываю рецепт, я могу получить ингредиенты.
Перебирая ингредиенты, я могу получить доступ к рецепту (двунаправленный ассоциация) как объект.
Но, когда я хочу получить доступ к еде, я не получаю FoodEntity
объект, как я и ожидал, но только идентификатор еды (который сам является объектом из-за используемой библиотеки uuid).
Почему бы мне не получить FoodEntity
объект?
Что случилось?
Надеюсь, я ясно дал понять!
Спасибо за вашу помощь.
Ура,
LT.
Вот что у меня есть (уменьшено для лучшей читаемости):
/**
* 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;
}
Ошибка, которую вы делаете, состоит в том, что вы добавляете оба @Column
так же как @OneToOne
(в случае еды) и @ManyToOne
(в случае рецепта). Свойство — это либо отношение / ассоциация, либо поле / столбец, но не оба.
Вы должны удалить свой @Column
аннотации от ассоциаций в определениях вашей сущности.
/**
* 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;
}
Других решений пока нет …