[英]How can I check if a doctrine entity has a oneToOne mapped entity?
我使用原則, User
和Info
實體彼此是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映射。 但是您的映射是錯誤的。 您有兩個選擇。
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'
));
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.