嗨我在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
任何有助于解决这个问题的帮助都会受到很大的关注。
由于
安德鲁
答案 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)
最有可能的是,它与延迟加载有关。在您开始使用代理对象之前,不会加载它。