Symfony无法为双向onetoOne关系

时间:2015-09-02 07:28:28

标签: php symfony doctrine one-to-one

我有两个表格UserSurvey,用户只能填写一个调查表,因此我在两者之间建立的关系是Bidirectional onetoOne

应用程序的流程是用户必须先注册然后填写调查,注册就可以了。

我遇到的问题是,当用户尝试保存调查时,他会收到以下错误

  

[1/2] PDOException:SQLSTATE [23000]:完整性约束违规:   1452无法添加或更新子行:外键约束失败   (mv2mv_survey,CONSTRAINT FK_E81A494BBF396750 FOREIGN KEY   (id)参考mv_userssurvey_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无法添加或更新子行:外键约束失败   (mv2mv_survey,CONSTRAINT FK_E81A494BBF396750 FOREIGN KEY   (id)参考mv_userssurvey_id))

我真的很感激任何帮助,我甚至放弃了整个数据库架构,并按照其他帖子的建议重新创建它,但这也没有帮助,我在这里缺少什么?

1 个答案:

答案 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);