我有两个表格User
和Survey
,用户只能填写一个调查表,因此我在两者之间建立的关系是Bidirectional
onetoOne
应用程序的流程是用户必须先注册然后填写调查,注册就可以了。
我遇到的问题是,当用户尝试保存调查时,他会收到以下错误
[1/2] PDOException:SQLSTATE [23000]:完整性约束违规: 1452无法添加或更新子行:外键约束失败 (
mv2
。mv_survey
,CONSTRAINTFK_E81A494BBF396750
FOREIGN KEY (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
,CONSTRAINTFK_E81A494BBF396750
FOREIGN KEY (id
)参考mv_users
(survey_id
))
我真的很感激任何帮助,我甚至放弃了整个数据库架构,并按照其他帖子的建议重新创建它,但这也没有帮助,我在这里缺少什么?
答案 0 :(得分:1)
$调查 - > setUserID(' 1&#39);
这是不好的做法。您应该直接设置实体。
这是你应该怎么做的:
用户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;
}
调查orm.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)设置/获取:
$ entity1-> setEntity2($ ENTITY2);