Symfony2 / Doctrine / Mapping Converter / Relationship / PK Strange Behavior

时间:2013-08-16 12:01:37

标签: symfony doctrine primary-key converter relationship

搜索了一整天后,我决定向你展示我在Symfony2中的映射转换器实现的问题。首先,我告诉你我的设置:

具有关系的用户表:

-- -----------------------------------------------------
-- 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) ;

在我的数据库中,我使用带有此命令的doctrine转换器:

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;
}

这当然完全不是我想要的,而且我经常从数据库中一次创建许多entite,因此手动修复它并不是一个真正的选择。不幸的是,我不知道我是否引起了问题或学说。我错过了什么吗?

感谢您的回复。

1 个答案:

答案 0 :(得分:0)

将我的评论复制到此处,因为我确认了实际问题。

Doctrine不支持单个列既是主要ID又是参与拥有关系。想一想。 $ user-> getId()应返回什么? id或$ userData?

向用户添加user_data_id列并将关系置于其上。

我只想编辑yml文件,然后使用doctrine:schema:drop / update来生成表格。除非你真的需要保持控制,否则让Doctrine做事情。