我创建了一个与sfGuardUser模型有关系的sfGuardUserProfile模型。然后我定义另一个与sfGuardUserProfile有关的模型。我在创建数据库时没有遇到任何错误,但是当我尝试将数据保存到我的操作文件中的sfGuardUserProfile时,我收到此错误:
SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败
在我的schema.yml中,我将关系定义为一对一。
我不确定为什么会失败。 Doctrine是否根本不支持向已经存在关系的模型添加新关系?
修改的 这是我的schema.yml:
sfGuardUserProfile:
tableName: sf_guard_user_profile
columns:
sf_guard_user_id: { type: integer(4) }
email: { type: string(255) }
relations:
User:
class: sfGuardUser
type: one
foreignType: one
onDelete: CASCADE
local: sf_guard_user_id
foreign: id
foreignAlias: Profile
FacebookAccount:
tableName: facebook_account
columns:
user_id: { type: integer(4) }
page_id: { type: integer }
relations:
sfGuardUserProfile:
type: one
foreignType: one
class: sfGuardUserProfile
local: user_id
foreign: sf_guard_user_id
onDelete: CASCADE
foreignAlias: FacebookAccount
我这样做时遇到错误:
$profile = $this->getUser()->getProfile();
$profile->setEmail('someone@somewhere.com');
$profile->save();
生成的SQL:
INSERT INTO sf_guard_user_profile (sf_guard_user_id, email) VALUES (?, ?) - (1, someone@somewhere.com)
确切错误:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`site`.`sf_guard_user_profile`, CONSTRAINT `sf_guard_user_profile_sf_guard_user_id_facebook_account_user_id` FOREIGN KEY (`sf_guard_user_id`) REFERENCES `facebook_account` (`user_id`))
答案 0 :(得分:2)
我认为您的问题是您的FacebookAccount模型没有链接到您的个人资料模型上的主键,而且Doctrine不知道如何使用它。更改您的FacebookAccount以引用配置文件主键:
relations:
sfGuardUserProfile:
type: one
foreignType: one
class: sfGuardUserProfile
local: user_id
foreign: id
onDelete: CASCADE
foreignAlias: FacebookAccount
或与sfGuardUser的主键相关:
relations:
sfGuardUser:
type: one
foreignType: one
class: sfGuardUser
local: user_id
foreign: id
onDelete: CASCADE
foreignAlias: FacebookAccount
答案 1 :(得分:1)
您必须确保不破坏数据库完整性:http://msdn.microsoft.com/en-us/library/ms175464.aspx。您可以按正确顺序访问插入行,例如:
$sfGuardUser = new sfGuardUser();
$sfGuardUser->id = 1;
$sfGuardUser->save();
$sfGuardUserProfile = new sfGuardUserProfile();
$sfGuardUserProfile->user_id = $sfGuardUser->id;
$sfGuardUserProfile->save();
或者像这样:
$sfGuardUser = new sfGuardUser();
$sfGuardUser->id = 1;
$sfGuardUserProfile = new sfGuardUserProfile();
$sfGuardUserProfile->User = $sfGuardUser;
sfGuardUserProfile->save();