具有 OneToOne 关系的两个模型之间的错误(违反完整性约束)

Posted

技术标签:

【中文标题】具有 OneToOne 关系的两个模型之间的错误(违反完整性约束)【英文标题】:Errors between two models with OneToOne relation (Integrity constraint violation) 【发布时间】:2012-03-03 23:26:27 【问题描述】:

当需要在数据库中插入新信息时,我遇到了 Doctrine 2 和 OneToOne 关系的问题。

型号:User.php

<?php

/**
 * @Entity @Table(name="user")
 **/
class User

    /** @Id @Column(type="integer") @GeneratedValue **/
    protected $id;
    /** @Column(type="string") **/
    protected $lastname;
    /** @Column(type="string") **/
    protected $firstname;
    /** @Column(type="string") **/
    protected $email;
    /** @Column(type="integer") **/
    protected $status;
    /** @Column(type="string") **/
    protected $created;
    /** @Column(type="integer") **/
    protected $created_by;

   /**
    * @OneToOne(targetEntity="UserAuth", mappedBy="user")
    */
    protected $auth;

    public function getAuth()
    
        return $this->auth;
    

    public function setAuth($auth)
    
        $this->auth = $auth;
    
    // + all setters and getters...

型号:UserAuth.php

<?php

/**
 * @Entity @Table(name="user_auth")
 **/
class UserAuth

    /** @Id @Column(type="integer") @GeneratedValue **/
    protected $id;
    /** @Column(type="integer") **/
    protected $user_id;
    /** @Column(type="string") **/
    protected $username;
    /** @Column(type="string") **/
    protected $password;
    /** @Column(type="string") **/
    protected $role;

    /**
     * @OneToOne(targetEntity="User", inversedBy="auth")
     * @JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;

    public function getUser()
    
        return $this->user;
    
    // + all setters and getters...

检索数据并更新它们没有问题:

$user = $orm->find('User', 2);

echo $user->getAuth()->getUsername();

$user->getAuth()->setUsername('jprlauzier');

$orm->persist($user);

$orm->flush();

但是,不可能创建一个新的:

$user = $orm->find('User', 3);

$auth = new UserAuth();
$auth->setUsername('newusername');
$auth->setPassword('51abb9636078defbf888d8457a7c76f85c8f114c');
$auth->setRole('user');

$orm->persist($auth);

$user->setAuth($auth);

$orm->persist($user);

$orm->flush();

错误:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity         constraint violation: 1048 Column 'user_id' cannot be null' in     /Applications/MAMP/htdocs/test/library/Doctrine/DBAL/Statement.php:131 Stack trace: #0     /Applications/MAMP/htdocs/test/library/Doctrine/DBAL/Statement.php(131): PDOStatement-    >execute(NULL) #1 /Applications/MAMP/htdocs/test/library/Doctrine/ORM/Persisters/BasicEntityPersister.php(239): Doctrine\DBAL\Statement->execute() #2 /Applications/MAMP/htdocs/test/library/Doctrine/ORM/UnitOfWork.php(870): Doctrine\ORM\Persisters\BasicEntityPersister->executeInserts() #3 /Applications/MAMP/htdocs/test/library/Doctrine/ORM/UnitOfWork.php(304): Doctrine\ORM\UnitOfWork->executeInserts(Object(Doctrine\ORM\Mapping\ClassMetadata)) #4 /Applications/MAMP/htdocs/test/library/Doctrine/ORM/EntityManager.php(355): Doctrine\ORM\UnitOfWork->commit(NULL) #5 /Applications/MAMP/htdocs/test/application/Bootstrap.php(106): Doctrine\ORM\EntityManager->flush() #6 /Applications/MAMP/htdocs/test/application/Bo in /Applications/MAMP/htdocs/test/library/Doctrine/DBAL/Statement.php on line 131

Doctrine 没有找到 user_id 来在表 user_auth 中创建新条目。但是,我在我的模型中指出了 @JoinColumn(name="user_id", referencedColumnName="id") ......为了您的帮助!我整天都在寻找这个。

【问题讨论】:

【参考方案1】:

当您创建 User 实例时,User::id 的实例仍然为空。这就是该学说返回约束违规的原因。

看这里 http://docs.doctrine-project.org/en/2.0.x/reference/working-with-associations.html#transitive-persistence-cascade-operations

【讨论】:

工作链接:docs.doctrine-project.org/en/latest/reference/…【参考方案2】:

删除:

/** @Column(type="integer") **/
protected $user_id;

并更新数据库结构。

【讨论】:

其实我不得不做 $auth->setUser($user);还有,删除了 $user_id ...更新我的数据库结构是什么意思?

以上是关于具有 OneToOne 关系的两个模型之间的错误(违反完整性约束)的主要内容,如果未能解决你的问题,请参考以下文章

具有 OneToOne 关系的 Django 模型?

ew@OneToOne 与不使用 JOIN 的播放框架的关系

OnetoOne 未知映射者

我在 Django 应用程序中同一类的两个对象之间存在 OneToOne 关系。是不是可以强制执行这种关系的唯一性?

Django Admin:如何在 oneToOne 关系中的两个模型中显示带有 list_display 的字段值?

Django - 将 ForeignKey 关系更改为 OneToOne