教义2多对多带翻译

Posted

技术标签:

【中文标题】教义2多对多带翻译【英文标题】:doctrine 2 many to many with translation 【发布时间】:2013-08-04 20:42:57 【问题描述】:

我对教义 2 有疑问。 我有以下数据库表: 因此,Doctrine 生成从站点的桌面设置中检索数据的实体,但我需要从desk_settings 表中检索所有设置并使用desk_id 从desk_settings_values 表中覆盖其值

数据库图片 -> https://docs.google.com/file/d/0B7rOFTJGfJwTWEQ3bXZFU1hXZlU/edit?usp=sharing

使用脚本生成的教义实体:

/** * 桌子 * * @ORM\Table(name="desk") * @ORM\实体 */ 课桌 /** * @var 整数 * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\ID * @ORM\GeneratedValue(strategy="IDENTITY") */ 私人 $id; /** * @var 字符串 * * @ORM\Column(name="code", type="string", length=100, nullable=false) */ 私人$代码; /** * @var 字符串 * * @ORM\Column(name="description", type="string", length=255, nullable=false) */ 私人$描述; /** * @var \日期时间 * * @ORM\Column(name="created", type="datetime", nullable=false) */ 私人$创建; /** * @var \Doctrine\Common\Collections\Collection * * @ORM\ManyToMany(targetEntity="PayBox\Entity\DeskSettings", mappedBy="desk") */ 私人 $deskSettings; 使用 Doctrine\ORM\Mapping 作为 ORM; /** * 桌面设置 * * @ORM\Table(name="desk_settings") * @ORM\实体 */ 课桌设置 /** * @var 整数 * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\ID * @ORM\GeneratedValue(strategy="IDENTITY") */ 私人 $id; /** * @var 字符串 * * @ORM\Column(name="setting_key", type="string", length=100, nullable=false) */ 私人 $settingKey; /** * @var 字符串 * * @ORM\Column(name="setting_value", type="string", length=255, nullable=false) */ 私人 $settingValue; /** * @var \日期时间 * * @ORM\Column(name="created", type="datetime", nullable=false) */ 私人$创建; /** * @var \Doctrine\Common\Collections\Collection * * @ORM\ManyToMany(targetEntity="PayBox\Entity\Desk", inversedBy="deskSettings") * @ORM\JoinTable(name="desk_settings_values", * 加入列= * @ORM\JoinColumn(name="desk_settings_id", referencedColumnName="id") * , * inverseJoinColumns= * @ORM\JoinColumn(name="desk_id", referencedColumnName="id") * * ) */ 私人 $desk;

【问题讨论】:

您能否删除 SQL 架构定义和 Getters & Setters 并完整发布您的 3 个实体但不包含方法(getters & setters)? 完成。 Doctrine 仅生成 2 个实体,其跳过 DeskSettingsValues 实体 “使用desk_id覆盖desk_settings_values表中的值”。为什么desk_settings_values 必须与desk 有关系?这似乎是一个更明显的模式选择:Many Desks to Many Desk_settings,One Desk_setting 到 Many Desk_settings_values。顺便说一下,你的数据库模式的图片也很好。 实际上 .. 重新考虑 .. 如果 DeskSettings 类似于 DeskSettingsDefinition 那么desk_settings_values 可能是 DeskSettings。然后,将许多桌面设置为多个桌面设置,一个桌面设置到多个桌面设置定义是有意义的。因此,DeskSettingsDefinitions(在您的架构中:DeskSettings)与办公桌没有直接关系。 DeskSettingsDefinitions 将为每个 DeskSetting 保存唯一的东西。 DeskSetting 将保存 Desk 独有的值。 抱歉,无法添加图片,我还没有 10 个帖子。通过这种方法,值来自desk_setting,因此它是默认值,可以在desk_settings_values中重新定义或可以使用默认值 【参考方案1】:

来自 Doctrine 文档:

为什么多对多关联不太常见?因为你经常 想要将附加属性与关联关联,其中 如果你引入一个关联类。因此,直接 多对多关联消失,取而代之的是 3 个参与方之间的一对多/多对一关联 类。

您需要将类结构更改为一对多/多对一。 See this blog.

【讨论】:

以上是关于教义2多对多带翻译的主要内容,如果未能解决你的问题,请参考以下文章

教义多对多关系问题

教义中的多对多关系

教义加入多对多没有关联

教义 - 以表为目标的多对多

教义 - 在多对多关系表中插入记录

从教义中的多对多自引用实体中获取孩子