1

地点.yml

manyToOne:
  excursions:
    targetEntity: Excursions
    inversedBy: places
    inverse: true
    cascade: ["ALL"]
    nullable: false
    joinColumn:
      name: idx
      referencedColumnName: place_id

游览.yml

oneToOne:
  places:
    targetEntity: Places
    mappedBy: excursions

游览有一个 place_id。所以$exccursion->getPlaces()只返回一行。

现在,当我尝试向Places表中插入一个值时,Doctrine2 说Not null violation: 7 ERROR: null value in column "idx" violates not-null constraint

我不知道为什么会这样。如果我删除manyToOne然后插入工作。但这一次getPlaces()是行不通的。

更新

问题是,我对数据库使用 mappedBy。我应该只这样做:

地点.yml

manyToOne:
  --remove--

游览.yml

oneToOne:
  places:
    targetEntity: Places
    joinColumn:
        name: place_id
        referencedColumnName: idx

这解决了问题。但我通过随机尝试/播放发现了这一点。所以,我不知道为什么 :) 任何人都知道,请取悦explain我。

4

1 回答 1

3

首先映射不正确。您不应该将ManyToOneinPlaces.yml和反面映射为OneToOnein 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关系应该在只有另一个的实体内
  2. OneToMany关系应该在具有另一个对象的实体内部
  3. joinColumn: name:应该具有您要在数据库中创建的列的名称
  4. 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 个位置或游览。

于 2012-11-11T13:24:27.927 回答