我使用条令,User
和Info
实体彼此是OneToOne
,当我调用用户实体时,首先我想检查该实体是否有信息,如果有,更新它,如果没有,为该用户创建一个信息实体。
我在我的用户实体中有一个更麻烦的方法:
public function hasInfo() {
return $this->info instanceof Info;
}
然后在我的脚本中我有:
$user = $em->find(User.....);
if ($user->hasInfo()) {
$info = $user->getInfo();
$something = $info->getSomething();
} else {
$info = new Info;
$info->setUser($user);
}
但我仍然得到实体Info
未找到错误。我做了一个打印调试,注意到它永远不会转到else子句,即使它没有信息,所以我得到了实体Info
未找到错误。我在上面的脚本中做错了什么?
这个既不起作用:
$user = $em->find(User...);
$Info = $user->getInfo();
if ($info !== null) {
...
它总是假定User
有一个Info
,并且从不转到else子句。对于OneToOne
之外的其他映射不存在这样的问题。
编辑1:我想这应该是因为两个实体都是由彼此的标识符映射的(因为它们是一对一的),而不是拥有FK的一方?这应该是问题吗?
编辑2:这是我的映射,我不使用注释,但使用php映射:
用户实体:
$metadata->mapOneToOne(array(
'fieldName' => 'info',
'targetEntity' => 'Info',
'mappedBy' => 'user',
'cascade' => array(
0 => 'remove',
1 => 'persist',
),
'joinColumns' => array(
0 => array(
'name' => 'id',
'referencedColumnName' => 'id',
'nullable' => true,
'onDelete' => 'cascade',
'columnDefinition' => NULL,
),
)
));
信息实体:
$metadata->mapOneToOne(array(
'fieldName' => 'user',
'targetEntity' => 'User',
'inversedBy' => 'info',
'joinColumns' => array(
0 => array(
'name' => 'id',
'referencedColumnName' => 'id',
'nullable' => true,
'columnDefinition' => NULL,
)
)
));
由于它们是oneToOne,信息实体的PK也是用户实体的PK。
具有空的Info表。它从不涉及其他条款。
// search by identifier:
$info = $em->find("Info", 1);
if ($info !== null) {
print("yes");
} else {
print("no");
}
但如果我使用findOneBy,效果很好!问题出在哪里?
$info = $em->getRepository('Info')->findOneBy(array('id' => 1));
为什么我不能使用find(),因为这只是标识符?
这是我的标识符定义:
$metadata->mapField(array( 'fieldName' => 'id',
'columnName' => 'id',
'type' => 'integer',
'nullable' => false,
'options' =>
array(
'unsigned' => true,
),
'id' => true,
));
我从未使用过php映射。但是你的映射是错误的。你有两个选择。
1) User
是拥有方
User
实体:
$metadata->mapOneToOne(array(
'fieldName' => 'info',
'targetEntity' => 'Info',
'inversedBy' => 'user',
'joinColumns' => array(
0 => array(
'name' => 'info_id', // <--------------- info_id
'referencedColumnName' => 'id',
'nullable' => true,
'onDelete' => 'cascade',
'columnDefinition' => NULL,
)
)
));
Info
实体:
$metadata->mapOneToOne(array(
'fieldName' => 'user',
'targetEntity' => 'User',
'mappedBy' => 'info'
));
2) Info
是拥有方
User
实体:
$metadata->mapOneToOne(array(
'fieldName' => 'info',
'targetEntity' => 'Info',
'mappedBy' => 'info'
));
Info
实体:
$metadata->mapOneToOne(array(
'fieldName' => 'user',
'targetEntity' => 'User',
'inversedBy' => 'info'
'joinColumns' => array(
0 => array(
'name' => 'user_id', // <--------------- user_id
'referencedColumnName' => 'id',
'nullable' => true,
'onDelete' => 'cascade',
'columnDefinition' => NULL,
)
)
));