2013-11-20 7 views
0

Привет всем и спасибо за помощь заранее!symfony2 doctrine mapping двунаправленные ссылки из существующего DB

Я newbe в рамках Symfony2, и я столкнулся с вопросом:

Как создать двунаправленную связь с существующей базой данных?

Сначала я создал базу данных для моего проекта, а затем сопоставил ее с yml-файлами; Просто, DB выглядит следующим образом:

Таблица user:

CREATE TABLE user (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `login` VARCHAR(255) NULL , 
    `password` VARCHAR(255) NULL , 
    `customer_id` INT NOT NULL ,  
    PRIMARY KEY (`id`) , 
    INDEX `fk_user_customer1_idx` (`customer_id` ASC) , 
    CONSTRAINT `fk_user_customer1` 
     FOREIGN KEY (`customer_id`) 
     REFERENCES `customer` (`id`) 
) ENGINE = InnoDB 

Таблица customer:

CREATE TABLE IF NOT EXISTS `customer` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `surname` VARCHAR(45) NULL , 
    `name` VARCHAR(45) NULL , 
    `midname` VARCHAR(45) NULL , 
    PRIMARY KEY (`id`) 
) ENGINE = InnoDB 

Если я прав, "пользователь" есть много-к-одному к "клиент"; и «пользователь» является стороной-владельцем, «клиент» - обратная сторона;

Затем я запустить эти команды:

php app/console doctrine:mapping:import ShadowTestBundle yml --force 

И получил результат:

Shadow\TestBundle\Entity\User: 
    type: entity 
    table: user 
    fields: 
     id: 
      id: true 
      type: integer 
      unsigned: false 
      nullable: false 
      generator: 
       strategy: IDENTITY 
     login: 
      type: string 
      length: 255 
      fixed: false 
      nullable: true 
     password: 
      type: string 
      length: 255 
      fixed: false 
      nullable: true 
    manyToOne: 
     customer: 
      targetEntity: Customer 
      cascade: { } 
      mappedBy: null 
      inversedBy: null 
      joinColumns: 
       customer_id: 
        referencedColumnName: id 
      orphanRemoval: false 
    lifecycleCallbacks: { } 


Shadow\TestBundle\Entity\Customer: 
    type: entity 
    table: customer 
    fields: 
     id: 
      id: true 
      type: integer 
      unsigned: false 
      nullable: false 
      generator: 
       strategy: IDENTITY 
     surname: 
      type: string 
      length: 45 
      fixed: false 
      nullable: true 
     name: 
      type: string 
      length: 45 
      fixed: false 
      nullable: true 
     midname: 
      type: string 
      length: 45 
      fixed: false 
      nullable: true 
    lifecycleCallbacks: { } 

и удовлетворяющие объекты от команды запуска:

php app/console doctrine:generate:entities ShadowTestBundle 

Сущность правильно отражает YML-файлы ;

Но и yml-файлы и сущности используют только однонаправленные ссылки; возможно ли генерировать двунаправленные ссылки, или я должен написать его вручную? Насколько я вижу, это должно выглядеть так:

Shadow\TestBundle\Entity\Customer: 
    type: entity 
    table: customer 
    fields: 
... 
     midname: 
      type: string 
      length: 45 
      fixed: false 
      nullable: true 
     oneToMany: 
      user: 
       targetEntity: User 
       mappedBy: cart 
lifecycleCallbacks: { } 

И у меня есть немного подвопрос: Почему на владеющей стороне (User), который генерируется с помощью доктрины, поле «inversedBy» является нулевым?

ответ

2

Импортированные сопоставления, генерируемые app/console doctrine:mapping:import, равны , а не, всегда правильно отражающие полную структуру базы данных, то есть когда речь заходит о непервичных ключах.

атрибут отображения в inversedBy устанавливаются в null, потому что доктрина не может угадать нужное $ свойства имени вашего ВЛАДЕЮЩЕГО-Side-ОБЪЕКТ для хранения обратной стороны объекта из базы данных - поэтому отображение генерируется без inversedBy набора. ..

... который является результатом автогенерации/ожидаемого имени собственности, являющегося camelCase Представление targetEntity по умолчанию/конвенция.

Если вы не импортируете сотни таблиц, я бы рекомендовал вручную настроить эти небольшие исправления вручную и не задерживаться в команде импорта.

0

стоит проверить документацию.

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/tools.html#reverse-engineering

Из документа,

Reverse Engineering является одноразовым процессом, который может получить вы начали с проектом. Преобразование существующей схемы базы данных в файлы сопоставления обнаруживает только около 70-80% необходимой информации о сопоставлении. Кроме того, обнаружение из существующей базы данных не может обнаружить обратные ассоциации, типы наследования, сущности с внешними ключами в качестве первичных ключей и многие семантические операции над ассоциациями, такими как каскад.

Надеюсь, это поможет. Ура!