0

嗨,我对 OneToOne 关系有一个小问题,当它运行以下内容时:-

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

这会按预期填充,但名为engineerFk 的关系字段是代理实体,其标识符字段设置为[],但值设置正确,见下文:-

被调试的实体

我的用户实体是这样的:-

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

任何重新解决这个问题的帮助都会非常感激。

谢谢

安德鲁

4

2 回答 2

1

我认为您在错误的实体上定义了关系的拥有方。它应该在拥有外键的实体上定义。我对注释不太满意,所以我将使用 YAML 来描述关联。

因此,对于 Engineer 实体,您应该具有以下内容:

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

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

oneToOne:
    engineer:
        targetEntity: Engineer
        mappedBy: user

阅读本文了解详情。

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

于 2012-06-22T09:16:00.980 回答
0

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

于 2012-06-21T15:26:16.557 回答