doctrine oneToOne unidirectional:获取映射对象

时间:2017-01-11 12:16:23

标签: php orm doctrine-orm associations one-to-one

我有三个简单的实体:RecipeEntityIngredientEntityFoodEntity

正如我理解正确的学说关联RecipeEntity应该与IngredientEntity有一个双向 oneToMany关系,因为一个食谱包含许多成分。 一种成分只含有一种食物,因此我假设从成分到食物的单向关联。 作为ID,我使用Uuids而不是使用第三方库的整数,这通常可以正常工作。

现在,我的SQL数据库中充满了指向食物成分的食谱。 当我打电话给食谱时,我可以找回食材。 循环遍历各个成分时,我可以将配方(双向关联)作为对象访问。

但是,当我想要访问食物时,我没有像我期望的那样获得FoodEntity个对象,而只获得食物的id(这是一个对象)本身是因为使用了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 个答案:

答案 0 :(得分: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;
}