我如何检查条令实体是否有oneToOne映射的实体


How can I check if a doctrine entity has a oneToOne mapped entity?

我使用条令,UserInfo实体彼此是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,
        )
    )
));