Doctrine OneToOne关系 - 独特的约束

时间:2016-02-04 22:15:24

标签: doctrine-orm entity-relationship entities unique-index

我有这种情况:

enter image description here



实体 MealListDay 是一天,有六餐(实体用餐)。现在我使用OneToOne关系。但是有问题,因为更多的日子不能有相同的实体用餐 - 错误:唯一约束。我知道,实体Meal在OneToOne关系中必须是唯一的,但有没有只使用这两个表的解决方案吗?

有什么想法吗?感谢。

实体MealListDay

    /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue
    * @var integer
    */
    protected $id;

    /**
     * @ORM\OneToOne(targetEntity="Meal", cascade={"persist"})
     * @ORM\JoinColumn(onDelete="SET NULL")
     * @var Meal
     */
    protected $elevenses;

    /**
     * @ORM\OneToOne(targetEntity="Meal", cascade={"persist"})
     * @ORM\JoinColumn(onDelete="SET NULL")
     * @var Meal
     */
    protected $soup;

    /**
     * @ORM\OneToOne(targetEntity="Meal", cascade={"persist"})
     * @ORM\JoinColumn(onDelete="SET NULL")
     * @var Meal
     */
    protected $mainMeal;

    /**
     * @ORM\OneToOne(targetEntity="Meal", cascade={"persist"})
     * @ORM\JoinColumn(onDelete="SET NULL")
     * @var Meal
     */
    protected $sideDish;

    /**
     * @ORM\OneToOne(targetEntity="Meal", cascade={"persist"})
     * @ORM\JoinColumn(onDelete="SET NULL")
     * @var Meal
     */
    protected $drink;

    /**
     * @ORM\OneToOne(targetEntity="Meal", cascade={"persist"})
     * @ORM\JoinColumn(onDelete="SET NULL")
     * @var Meal
     */

   protected $nosh;

实体餐:

/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
* @var integer
*/
private $id;

/**
 * @ORM\Column(type="string", length=150)
 */
protected $name;

/**
 * @ORM\Column(type="string", length=20)
 */
protected $type;

/**
 * @ORM\Column(type="simple_array", nullable=true)
 */
protected $allergens;

2 个答案:

答案 0 :(得分:0)

你的mmodel有第一个正常形式的问题。

尝试以下方法:

MealListDay - ID - dateOffered

MealOffering - MealListDayID(FK到MealListDay) - MealId(FK to Meal)

膳食 - ID - 姓名

BTW包括膳食中的过敏原也可能导致1NF问题

答案 1 :(得分:0)

我必须实现关系M:N,有结果。 我知道,属性过敏原不是1NF,但这些只是数字,它们与特定的过敏原名称和描述有关,这些名称和描述在课堂上是静态定义的。

enter image description here