Symfony无法插入双向onetoOne关系的记录


Symfony Not able to insert record for Bidirectional onetoOne relationship

我有两个表UserSurvey,用户只能填写一个调查,所以我在这两个表之间设置的关系是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(;