当我使用一对一和多对一的关系时,Doctrine2严格尝试inser t NULL

时间:2012-11-10 14:58:19

标签: php doctrine-orm

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我。

1 个答案:

答案 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

请注意:

  1. ManyToOne关系应该在只有1个
  2. 的实体内
  3. OneToMany关系应位于具有另一个
  4. 的多个对象的实体内
  5. joinColumn: name:应具有您要在数据库中创建的列的名称
  6. joinColumn: referencedColumnName:应该包含您要用于映射关系的目标实体的字段(我建议您使用id,因为它是唯一的)
  7. 创建此映射后,运行以下命令:

    php app/console doctrine:generate:entities BUNDLE_PREFIX
    

    BUNDLE_PREFIX是你的捆绑名称的第一部分。这将生成所有正确的getter和setter。不要忘记更新数据库模式:

    php app/console doctrine:schema:update --force
    

    作为我推荐的最后一条建议(除非您打算这样做),您可以将实体名称更改为ExcursionPlace,因为每个对象应仅包含1个位置或偏移。< / p>