2014-05-13 65 views
0

我要向您展示的模式中的每個實體都以這種方式定義:[ENTITY]。 每個實體都用「.idName」標識。像「.idName1.IdName2」這樣的幾個字段創建一個複合鍵,其中至少爲其中之一是外鍵。yaml中的OneToMany的複合外鍵(symfony2)

[Device.deviceId] has [Bookable.deviceId.bookableId] 
(.deviceId is a identifies a device) 

[Bookable.deviceId.bookableId] has [Booking.deviceId.bookableId.bookingId] 
(the tuple .deviceId.bookableId identifies a Bookable) 

我已經實現創建[設備]和[可預訂]之間的一對多關係(見代碼)但是當我想使可預訂和之間的另一種一對多的關係訂房它不工作和學說給我一個錯誤。運行後:

php app/console doctrine:schema:update 

顯示此錯誤:

[Doctrine\ORM\ORMException]                     
Column name `deviceId` referenced for relation from SearchDevice\WebBundle\Entity\Booking towards SearchDev 
ice\WebBundle\Entity\Bookable does not exist. 

完整YAML代碼是下一個: Device.orm.yml文件:

SearchDevice\WebBundle\Entity\Device: 
    type: entity 
    id: 
     deviceId: 
      type: integer 
      generator: {strategy: AUTO} 
    oneToMany: 
     bookables: 
      targetEntity: Bookable 
      mappedBy: device 

可預訂的文件:

SearchDevice\WebBundle\Entity\Bookable: 
    type: entity 
    id: 
     deviceId: 
      associationKey: deviceId 
     bookableId: 
      type: integer 
      generator: {strategy: AUTO} 
    manyToOne: 
     device: 
      targetEntity: Device 
      inversedBy: bookables 
      joinColumns: 
       deviceId: 
        referencedColumnName: deviceId 
    oneToMany: 
     bookings: 
      targetEntity: Booking 
      mappedBy: bookable 

Boo王文件:

SearchDevice\WebBundle\Entity\Booking: 
    type: entity 
    id: 
     deviceId: 
      associationKey: deviceId 
     bookableId: 
      associationKey: bookableId 
     bookingId: 
      type: integer 
      generator: {strategy: AUTO} 
    manyToOne: 
     bookable: 
      targetEntity: Bookable 
      inversedBy: bookings 
      joinColumns: 
       deviceId: 
        referencedColumnName: deviceId 
       bookableId: 
        referencedColumnName: bookableId 

貌似如果問題是出在預定實體,在那裏我說「的DeviceID」是可預訂的實體的列。由於它是一個外鍵列而不是一個明確的列,因此Doctrine在執行這種關係時存在問題。

回答

0

爲什麼你不只爲你的manyToOne關係使用bookableId? bookableId有一個自動遞增的ID,所以它顯然是唯一的。也許簡單加入列

bookableId: 
       referencedColumnName: bookableId 

可能在您的預訂實體中有效。

我不確定,因爲我通常使用註釋。但我不明白爲什麼你必須加入devideId加入預訂,如果bookableId是唯一的。

+0

感謝您的回答。最後,我決定刪除化合物Id並使用更簡單的模型(只有一個id列,如您所說)。這不是對原始問題的解決方案,而是解決方案。這個想法是使用「弱實體」(http://en.wikipedia.org/wiki/Weak_entity),但看起來很難或不可能實現。如果有人知道如何去做,我會很感激。 –