doctrine代理OneToOne实体的标识名称设置为[]但值是正确的

时间:2012-06-19 17:00:44

标签: zend-framework doctrine-orm

嗨我在OneToOne关系中遇到一个小问题,当运行如下: -

$userToView = $this->view->entityManager->getRepository("Ajfit\Entity\User")
                                            ->findOneByName($userName);

这会按预期填充,但名为engineerFk的关系字段(代理实体)将标识符字段设置为[]但值设置正确,请参阅以下内容: -

Debugged Entity

我的用户实体是: -

class User extends PersistentObject
{
   /**
    * @var integer $pk
    *
    * @ORM\Column(name="pk", type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="IDENTITY")
    */
    protected $pk;

   /**
    * @var integer $engineerFk
    * @ORM\OneToOne(targetEntity="Ajfit\Entity\Engineer")
    * @ORM\JoinColumn(name="pk", referencedColumnName="user_fk")
    */
    protected $engineerFk;
}

我的工程师实体设置如下: -

class Engineer extends PersistentObject
 {
 /**
  * @var integer $pk
  *
  * @ORM\Column(name="pk", type="integer")
  * @ORM\Id
  * @ORM\GeneratedValue(strategy="IDENTITY")
  */
 }
protected $pk;

我在数据库中的sql是这样的: -

/*user table*/

CREATE TABLE `user` (
  `pk` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`pk`)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8 COLLATE=utf8_bin


/*engineer table */


CREATE TABLE `engineer` (
  `pk` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_fk` int(10) unsigned NOT NULL,
  PRIMARY KEY (`pk`),
  KEY `engineer_user_fk` (`user_fk`),
  CONSTRAINT `engineer_user_fk` FOREIGN KEY (`user_fk`) REFERENCES `user` (`pk`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

任何有助于解决这个问题的帮助都会受到很大的关注。

由于

安德鲁

2 个答案:

答案 0 :(得分:1)

我认为你是在错误的实体上定义关系的拥有方。它应该在拥有外键的实体上定义。 我对注释感到不舒服,所以我将使用YAML来描述这种关联。

因此,对于Engineer实体,你应该有类似的东西:

oneToOne:
    user:
        targetEntity: User
        inversedBy: engineer
        joinColumn:
            name: user_fk
            referencedColumnName: pk

然后,对于User实体,配置应该是这样的:

oneToOne:
    engineer:
        targetEntity: Engineer
        mappedBy: user

阅读this了解详情。

此外,通过这种关联映射,Doctrine 2控制台工具将生成稍微不同的实体类。

答案 1 :(得分:0)

最有可能的是,它与延迟加载有关。在您开始使用代理对象之前,不会加载它。