データベースに新しい情報を挿入するときに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")を私のモデルに示しました!私はこれを一日中検索しました。
実際に、私は$ auth-> SETUSER($ユーザを)しなければならなかったここを参照してください。また、$ user_idを削除しました...私のデータベース構造を更新することによってあなたが意味するものは? –
データベーススキーマが正しいことを確認することを意味します。 – meze