2012-03-03 19 views
1

データベースに新しい情報を挿入するときにDoctrine 2とOneToOneの関係に問題があります。OneToOneリレーションを持つ2つのモデル間のエラー(整合性制約違反)

モデル: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_AUTHに新しいエントリを作成するのuser_idを見つけることができません。しかし、私はあなたの助けのために、@ JoinColumn(name = "user_id"、referencedColumnName = "id")を私のモデルに示しました!私はこれを一日中検索しました。

答えて

0

削除:

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

とデータベース構造を更新。

+0

実際に、私は$ auth-> SETUSER($ユーザを)しなければならなかったここを参照してください。また、$ user_idを削除しました...私のデータベース構造を更新することによってあなたが意味するものは? –

+0

データベーススキーマが正しいことを確認することを意味します。 – meze

関連する問題