2013-08-16 29 views
0

搜索完整後,我決定向Symfony2中的映射轉換器實現展示我的問題。首先,我告訴你我的設置:Symfony2/Doctrine/Mapping轉換器/關係/ PK奇怪行爲

有關係的用戶表:

-- ----------------------------------------------------- 
-- Table `event_manager`.`user` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `event_manager`.`user` ; 

CREATE TABLE IF NOT EXISTS `event_manager`.`user` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `email` VARCHAR(255) NULL , 
    `salt` VARCHAR(255) NULL , 
    `password` VARCHAR(255) NULL , 
    `logged_in` TINYINT(1) NULL , 
    `status` ENUM('active', 'inactive', 'deleted') NULL , 
    PRIMARY KEY (`id`) , 
    CONSTRAINT `fk_user_user_data1` 
    FOREIGN KEY (`id`) 
    REFERENCES `event_manager`.`user_data` (`user_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `event_manager`.`user_data` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `event_manager`.`user_data` ; 

CREATE TABLE IF NOT EXISTS `event_manager`.`user_data` (
    `user_id` INT NOT NULL , 
    `image_id` INT NULL , 
    `gender` ENUM('male','female') NULL , 
    `first_name` VARCHAR(255) NULL , 
    `last_name` VARCHAR(255) NULL , 
    `address` VARCHAR(255) NULL , 
    `zip` VARCHAR(255) NULL , 
    `city` VARCHAR(255) NULL , 
    `phone_private` VARCHAR(255) NULL , 
    `phone_mobile` VARCHAR(255) NULL , 
    `phone_work` VARCHAR(255) NULL , 
    `user_datacol` VARCHAR(45) NULL , 
    PRIMARY KEY (`user_id`) , 
    CONSTRAINT `fk_user_data_image1` 
    FOREIGN KEY (`image_id`) 
    REFERENCES `event_manager`.`image` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

CREATE INDEX `fk_user_data_image1_idx` ON `event_manager`.`user_data` (`image_id` ASC) ; 

隨着可在我的數據庫,我使用的學說轉換器使用此命令:

php app/console doctrine:mapping:convert yml ./src/path-to-bundle/Resources/config/doctrine --from-database --force --filter=User 

然後我在用戶YAML上得到這個結果:

User: 
    type: entity 
    table: user 
    fields: 
     email: 
      type: string 
      length: 255 
      fixed: false 
      nullable: true 
     salt: 
      type: string 
      length: 255 
      fixed: false 
      nullable: true 
     password: 
      type: string 
      length: 255 
      fixed: false 
      nullable: true 
     loggedIn: 
      type: boolean 
      nullable: true 
      column: logged_in 
     status: 
      type: string 
      length: null 
      fixed: false 
      nullable: true 
    manyToMany: 
     userGroup: 
      targetEntity: UserGroup 
      cascade: { } 
      mappedBy: null 
      inversedBy: user 
      joinTable: 
       name: user_has_user_group 
       joinColumns: 
        - 
         name: user_id 
         referencedColumnName: id 
       inverseJoinColumns: 
        - 
         name: user_group_id 
         referencedColumnName: id 
      orderBy: null 
    oneToOne: 
     id: 
      targetEntity: UserData 
      cascade: { } 
      mappedBy: null 
      inversedBy: null 
      joinColumns: 
       id: 
        referencedColumnName: user_id 
      orphanRemoval: false 
    lifecycleCallbacks: { } 

正如您所看到的,doctrine將「id」列作爲主要鍵並使用它,而不是作爲名稱的關係,這使我終於到了實體的方法是這樣的:

/** 
* Set id 
* 
* @param \Parella\EventManagerBundle\Entity\UserData $id 
* @return User 
*/ 
public function setId(\Parella\EventManagerBundle\Entity\UserData $id = null) 
{ 
    $this->id = $id; 

    return $this; 
} 

/** 
* Get id 
* 
* @return \Parella\EventManagerBundle\Entity\UserData 
*/ 
public function getId() 
{ 
    return $this->id; 
} 

這當然完全不是我想要的,我從經常在創造大量的entites一次數據庫,所以手動修復這不是一個真正的選擇。不幸的是,我不知道我是否會導致問題或教條。我想念什麼?

感謝您的回覆。

+0

有趣。學說可能不支持單一列既是主要的id也是不支持參與擁有的關係。即使這樣做,我認爲它可能會有點嘗試保持id同步。給用戶添加一個user_data_id列,並在其上放置關係。並且增加int值是一個小的價格,特別是如果你最終得到更多的關係。如果你真的想保持user_data_id同步,那麼你可以。 – Cerad

回答

0

複製我的評論到這裏,因爲我確認了實際的問題。

學說不支持一個列既是主要的id也是參與擁有關係。想想看。 $ user-> getId()應該返回什麼?該id或$ userData?

將user_data_id列添加到用戶,並將關係放在上面。

我只需編輯yml文件,然後使用doctrine:schema:drop/update來生成表格。除非你真的需要保持控制,否則讓教義做它的方式。

+0

我也對我的自己做了一些調查,並將外鍵放在user_data表格端檢查出來。在這種情況下,yaml中的主鍵不見了,但(!)關係被正確地命名爲「user」而不是「id」(猜測是因爲user_id前綴被doctrine檢測到)。在user_data方面,主鍵因爲它是一對一的關係並沒有那麼糟糕,並且在沒有用戶的情況下永遠不會有user_data行,但是學說會在「錯誤」的關係上構建關係方法,實體。我會堅持你的解決方案。謝謝。 – Jean

+0

請記住,學說:映射:只轉換聲明能夠處理大約80%左右的用例。正如你所說,只需調整yaml文件,然後使用doctrine重新創建數據庫。 – Cerad