簡體   English   中英

如何檢查一個學說實體是否具有一個oneToOne映射實體?

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

我使用原則, UserInfo實體彼此是OneToOne ,當我調用用戶實體時,首先要檢查該實體是否有信息,如果有,請更新,如果沒有,請創建一個該用戶的信息實體。

我的用戶實體中有以下hasser方法:

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以外的其他映射都沒有這樣的問題。

EDIT1:我想這應該是因為兩個實體都是通過彼此的標識符映射的(因為它們是一對一的),而不是擁有FK的擁有方? 應該是那個問題嗎?

EDIT2:這是我的映射,我不使用注釋,但是使用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。

與一個空的信息表。 它永遠不會去else子句。

// 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,
        )
    )
));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM