我有两个表User
和Survey
,用户只能填写一个调查,所以我在这两个表之间设置的关系是Bidirectional
onetoOne
该应用程序的流程是用户必须先注册,然后填写调查,注册过程很顺利。
我遇到的问题是,当用户试图保存调查时,他会得到以下错误
[1/2]PDOException:SQLSTATE[23000]:违反完整性约束:1452无法添加或更新子行:外键约束失败(
mv2
.mv_survey
,约束FK_E81A494BBF396750
外键(id
(参考mv_users
(survey_id
(
我使用的是YML
,而不是annotations
,所以这里是我的用户和调查的orm.yml
文件
用户
UserBundle'Entity'User:
type: entity
table: mv_users
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields:
username:
type: string
length: 255
name:
type: string
length: 255
email:
type: string
length: 255
unique: true
role:
type: string
length: 255
password:
type: string
length: 255
salt:
type: string
length: 255
nullable: true
isActive:
type: boolean
survey_id:
type: integer
nullable: true
oneToOne:
survey_allias:
targetEntity: XYZBundle'Entity'survey
joinColumn:
name: survey_id
referencedColumnName: id
lifecycleCallbacks: { }
调查
XYZBundle'Entity'survey:
type: entity
table: mv_survey
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields:
gender:
type: string
length: 255
nullable: true
dob:
type: date
nullable: true
postcode:
type: integer
nullable: true
userID:
type: integer
column: user_id
oneToOne:
user_allias:
targetEntity: UserBundle'Entity'User
inversedBy: survey_allias
joinColumn:
name: id
referencedColumnName: survey_id
lifecycleCallbacks: { }
我知道我可能应该使用Fixtures,但只是为了测试控制器内部的一切是否正常,我这样做是为了插入数据
$survey = new Survey();
$survey->setGender('Male');
$survey->setDob(new 'DateTime());
$survey->setUserID('1');
$manager->persist($survey);
$manager->flush();
这给出了的错误
[1/2]PDOException:SQLSTATE[23000]:违反完整性约束:1452无法添加或更新子行:外键约束失败(
mv2
.mv_survey
,约束FK_E81A494BBF396750
外键(id
(参考文献mv_users
(survey_id
(
我真的很感激在这方面的任何帮助,我甚至删除了整个数据库模式,并按照其他帖子的建议重新创建了它,但这也没有帮助,我在这里缺少什么?
$survey->setUserID('1'(;
这是不好的做法。您应该直接设置实体。
你应该这样做:
用户orm.yml
无论是在你的orm.yml还是在你的实体中,你都不需要surveyID属性。
oneToOne:
survey:
targetEntity: XYZBundle'Entity'survey
mappedBy: user
用户实体
protected $survey;
public function setSurvey(Survey $survey)
{
$this->survey = $survey;
}
public function getSurvey()
{
return $this->survey;
}
调查表单.yml
在orm.yml或实体中都不需要userID属性。
oneToOne:
user:
targetEntity: UserBundle'Entity'User
inversedBy: survey
joinColumn:
name: survey_id
referencedColumnName: id
调查实体
protected $user;
public function setUser(User $user)
{
$this->user = $user;
}
public function getUser()
{
return $this->user;
}
养成让Doctrine处理外键之类的东西的习惯。所有实体必须实现的关系都是直接用于实体(而不是id(的setter/getter:
$entity1->setEntity2($entity2(;