Places.yml
manyToOne:
excursions:
targetEntity: Excursions
inversedBy: places
inverse: true
cascade: ["ALL"]
nullable: false
joinColumn:
name: idx
referencedColumnName: place_id
Excursions.yml
oneToOne:
places:
targetEntity: Places
mappedBy: excursions
Excursion有一个place_id。所以$exccursion->getPlaces()
仅返回一行。
现在,当我尝试向Places
表插入一个值时,Doctrine2说Not null violation: 7 ERROR: null value in column "idx" violates not-null constraint
我不知道为什么会这样。如果我删除manyToOne
,则插入有效。但这次getPlaces()
无效。
更新
问题是,我使用mappedBy对数据库。我应该这样做:
Places.yml
manyToOne:
--remove--
Excursions.yml
oneToOne:
places:
targetEntity: Places
joinColumn:
name: place_id
referencedColumnName: idx
这解决了这个问题。但我通过随机尝试/玩耍找到了这个。所以,我不知道为什么:)任何人都知道请explain
我。
答案 0 :(得分:3)
首先,映射不正确。您不应该ManyToOne
中有Places.yml
,而OneToOne
中的反面会被映射为Excursions.yml
。这很可能是你遇到这些错误的原因
您还希望Excursion
有一个Places
对象链接到它,但如果我理解您的问题,Places
可能会有更多Excursions
个对象。所以你的映射应该是这样的:
# Places.yml
OneToMany:
excursions:
tagertEntity: Excursions
mappedBy: places
和
# Excursions.yml
ManyToOne:
places:
targetEntity: Places
inversedBy: excursions
joinColumn:
name: places_id
referencedColumnName: id
请注意:
ManyToOne
关系应该在只有1个OneToMany
关系应位于具有另一个joinColumn: name:
应具有您要在数据库中创建的列的名称joinColumn: referencedColumnName:
应该包含您要用于映射关系的目标实体的字段(我建议您使用id,因为它是唯一的)创建此映射后,运行以下命令:
php app/console doctrine:generate:entities BUNDLE_PREFIX
BUNDLE_PREFIX
是你的捆绑名称的第一部分。这将生成所有正确的getter和setter。不要忘记更新数据库模式:
php app/console doctrine:schema:update --force
作为我推荐的最后一条建议(除非您打算这样做),您可以将实体名称更改为Excursion
和Place
,因为每个对象应仅包含1个位置或偏移。< / p>