доктрина oneToOne однонаправленная: получить сопоставленный объект

У меня есть три простых объекта: 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;
}

1

Решение

Ошибка, которую вы делаете, состоит в том, что вы добавляете оба @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;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]