我有许多@ManyToMany
可以正常工作的关联映射,但是当尝试使用双向@OneToOne
或@ManyToOne
关联来持久化实体时,Doctrine 会引发以下错误:
Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'uid' cannot be null'
实体/EntityBase.php
namespace Entities;
class EntityBase{
/** @Column(type="integer", columnDefinition="INT AUTO_INCREMENT NOT NULL") */
protected $id;
/** @Column(type="datetime") */
protected $created;
/** @Column(type="datetime") */
protected $updated;
}
实体/用户.php
namespace Entities;
/**
* @Entity(repositoryClass="Repositories\UserRepository")
* @Table(name="users", indexes={@Index(name="id", columns={"id"})})
*/
class User extends EntityBase{
/** @Id @Column(type="string") */
protected $uid;
/** @Column(type="string", nullable=true) */
protected $first_name;
/** @Column(type="string", nullable=true) */
protected $middle_name;
/** @Column(type="string", nullable=true) */
protected $last_name;
/** @OneToOne(targetEntity="Entities\Interest", mappedBy="user") **/
private $interest;
}
实体/兴趣.php
namespace Entities;
/**
* @Entity(repositoryClass="Repositories\InterestRepository")
* @Table(name="interests", indexes={@Index(name="id", columns={"id"})})
*/
class Interest extends EntityBase{
/** @Id @Column(type="string") */
protected $uid;
/** @Column(type="string", nullable=true) */
protected $interests;
/**
* @OneToOne(targetEntity="Entities\User", inversedBy="interest")
* @JoinColumn(name="uid", referencedColumnName="uid")
**/
private $user;
public function setUserId($uid){
$this->uid = $uid;
}
public function setInterests($interests){
$this->interests = $interests;
}
}
上述关联应该表明一个用户可以有一个兴趣并且兴趣属于一个用户。我将uid
其用作主键,而不是id
因为被持久化的数据集来自一个 API,其中所有用户都有一个唯一的uid
. 我不确定为什么我'uid' cannot be null
在转储数据集时会看到,并且uid
肯定是作为字符串传递的。
这是我的交互代码:
//Example
$data = array('uid' => '10298564', 'interests' => 'Creative Art');
if(!$interest = $entityManager->getRepository('Entities\Interest')->findOneBy(array('uid' => $data['uid']))){
$interest = new Entities\Interest();
}
$interest->setUserId($data['uid']);
$interest->setInterest($user['interests']);
$entityManager->persist($interest);
$entityManager->flush();
当我使用@OneToOne
用户和兴趣之间的关联运行它时,我Integrity Constraint violation
在坚持时收到错误。但是,如果我删除关联,实体会正确保留并更新数据库。
我错过了什么吗?