【问题标题】:Symfony Not able to insert record for Bidirectional onetoOne relationshipSymfony 无法为双向 onetoOne 关系插入记录
【发布时间】:2015-11-27 14:24:16
【问题描述】:

我有两张表UserSurvey 一个用户只能填写一个调查,所以我在两者之间设置的关系是BidirectionalonetoOne

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

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

[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))

我将非常感谢对此的任何帮助,我什至删除了整个数据库架构并按照其他帖子的建议重新创建了它,但这也没有帮助,我在这里缺少什么?

【问题讨论】:

    标签: php symfony doctrine one-to-one


    【解决方案1】:

    $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;
    }
    

    调查 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)的 setter/getter:

    $entity1->setEntity2($entity2);

    【讨论】:

    • 感谢您的快速回复,请您详细说明$entity1->setEntity2($entity2);是什么
    • 我的意思是你必须让 Doctrine 处理你的关系。关系只是一个对象到另一个对象,因此您的实体属性/getter/setter 应该是对象相关的,而不是 ids 相关的。所以不要那样做:$entity1->setEntity2ID($entity2->getId()); 但是这个:$entity1->setEntity2($entity2);
    • 对不起,我迷路了,我正试图绕过它,所以这就是我认为应该发生的事情。只要我可以将用户表(列:id)与调查表(列:user_id)链接起来,我认为我不再需要用户表中的调查 ID 列。这给了我 onetoOne 关系,所以当用户填写调查表时,我如何设置调查表中的user_id 列,我的 setter 和 getter 设置与您的完全相同,但 user_id 列中没有保存任何内容,只是一个空值。跨度>
    • 你能把你的整个代码放在一个要点里让我检查吗?
    • 这里有一个固定的要点:gist.github.com/Babacooll/24cb84baf5c24329ee07。您刚刚忘记在您的控制器中设置调查问卷中的 setUser()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多