Как добавить индекс ограничений в yaml Doctrine 2 - PullRequest
1 голос
/ 17 января 2012

У меня есть две таблицы, описанные в yaml.

Например:

Entities\User:
  type: entity
  table: users
  id:
    id:
      type: integer
      generator:
        strategy: AUTO
  fields:
    username:
      type: string
      length: 64
  oneToMany:
    children:
      targetEntity: UserToUser
      mappedBy: parent
    parents:
     targetEntity: UserToUser
     mappedBy: child

Entities\UserToUser:
  type: entity
  table: user_to_user
  id:
    id:
      type: integer
      generator:
        strategy: AUTO
  fields:
    user_id:
      type: integer
      nullable: false
    child_id:
      type: integer
      nullable: false
  manyToOne:
    parent:
      targetEntity: User
      inversedBy: children
      joinColumn:
        name: user_id
        referencedColumnName: id
    child:
      targetEntity: User
      inversedBy: parents
      joinColumn:
        name: child_id
        referencedColumnName: id

в этом случае все генерируется хорошо, но на самом деле в базе данных в таблице user_to_user нет уникального индекса для полей: user_id и child_id. Таким образом, есть возможность добавить 2 записи с одинаковым значением.

Я пытался добавить ограничения

uniqueConstraints:
    child_user_idx:
      columns: child_id,user_id

или 2 других способа:

id:
    user_id:
      type: integer
    child_id:
      type: integer

или

  id:
    parent:
      associationKey: true
    child:
      associationKey: true

Попытка объединить эти параметры, но в результате при проверке консоли доктрины каждый раз возникали ошибки, но сгенерированный sql был именно тем, что мне было нужно.

Один из них, например:

он объединяет столбцы ассоциации 'parent' должны соответствовать ВСЕМ столбцам идентификатора исходного объекта 'Entities \ UserToUser', однако 'child_id' отсутствует. * Столбцы соединения ассоциации 'child' должны соответствовать ВСЕМ столбцам идентификатора исходного объекта 'Entities \ UserToUser', однако 'user_id' отсутствует.

Я не очень понимаю, что мне нужно добавить, поэтому проверка правильности прошла

Ответы [ 2 ]

3 голосов
/ 24 апреля 2012

При использовании YAML вы можете использовать следующие обозначения:

Vendor\CategoryBundle\Entity\Category:
    type: entity
    table: category
    indexes:
        # the name of the index
        category_slug_idx:
            # Columns is an array, specify multiple columns for
            # a compound index
            columns: [ slug ]
    id:
        id:
            type: integer
            generator: { strategy: AUTO }

    fields:
        name:
            type: string
        slug:
            type: string

вы можете видеть, что вы можете объявить индексы под индексами: узел

1 голос
/ 16 февраля 2012

Я думаю, это то, что вы ищете https://gist.github.com/1845982

Vendor\BlogBundle\Entity\BlogImage:
    type: entity
    table: blog_image

    # use two fields for our identifier
    id:
        blog:
            # flag as an association key 
            associationKey: true
        image:
            associationKey: true
    fields:
        caption:
            type: string

    # Specify our relationships for above
    manyToOne:
        project:
            targetEntity: Vendor\BlogBundle\Entity\Blog
            inversedBy: images

    oneToOne:
        image:
            targetEntity: Vendor\ImageBundle\Entity\Image
...