我对Doctrine很新,在某种情况下需要帮助。我有2个简单的表专辑&类型。请检查以下结构:
相册
id | title | genre_id | createdon
1 | Album 1 | 1 | 21/05/2015
2 | Album 2 | 2 | 21/05/2015
类型
id | genre | active
1 | Pop | 1
2 | Blue | 1
3 | Rock | 1
4 | Country | 1
Albums表中的genre_id 映射到Genre表的 id 列。
在相册实体中,我已通过以下过程对其进行了映射:
/**
* @ORM\OneToOne(targetEntity="Genre", mappedBy="albums")
* @ORM\JoinColumn(name="genre_id", referencedColumnName="id")
**/
private $genre;
public function getGenre(){
return $this->genre;
}
public function setGenre($value)
{
$this->genre = $value;
return $this;
}
我可以通过 getGenre()方法完美地获取流派名称,但问题是在将值插入数据库时。我需要插入genre_id这是一个整数值,但在从控制器调用 setGenre()方法后,我收到以下错误:
关联字段“Album \ Entity \ Genre”类型的预期值 “专辑\实体\专辑#$ genre”,改为“字符串”。
我还试过指定另一个私有变量,如原始列名,即genre_id,如下所示:
/** @ORM\Column(type="integer") */
protected $genre_id;
public function setGenre($value)
{
$this->genre_id = $value;
return $this;
}
但后来我收到以下错误:
执行'INSERT INTO相册时发生异常(标题, createdon,genre_id)VALUES(?,?,?)'with params [“nfhgfh”, “2015年5月21日”,null]:
SQLSTATE [23000]:完整性约束违规:1048列 'genre_id'不能为空
我从控制器那样调用实体:
$albums = new Albums();
$albums->setTitle($postData['title']);
$albums->setGenre($postData['genre_id']);
$albums->setCreatedon(date('d/m/Y'));
$this->em()->persist($albums);
$this->em()->flush();
我严重陷入这个问题,需要你的帮助。我没有任何线索如何获得null值。请帮忙。
答案 0 :(得分:1)
问题是您需要将genre
中的Album
设置为Album\Entity\Genre
的实例。
例如:
$genre = new Genre();
$genre->setId($postData['genre_id']);
$albums = new Albums();
$albums->setTitle($postData['title']);
$albums->setGenre($genre);
$albums->setCreatedon(date('d/m/Y'));
$this->em()->persist($albums);
$this->em()->flush();
修改
要修复级联错误,您需要在映射中添加cascade
参数。
/**
* @ORM\OneToOne(targetEntity="Genre", mappedBy="albums", cascade={"persist"})
* @ORM\JoinColumn(name="genre_id", referencedColumnName="id")
**/
private $genre;
您可能还需要在$album
实体的Genre
变量中添加类似的内容,我无法确切记住它需要的方向。
答案 1 :(得分:1)
通过id查询类型为我工作。请在控制器中找到我的更新代码:
$albums = new Albums();
$albums->setTitle($postData['title']);
$albums->setCreatedon(date('d/m/Y'));
$genre = $this->em()->find('Album\Entity\Genre', $postData['genre_id']);
$albums->setGenre($genre);
$this->em()->persist($albums);
$this->em()->flush();
这是您指定的过程吗?谢谢你的帮助。