无法在OneToOne关系

时间:2015-05-21 11:38:43

标签: php zend-framework doctrine-orm zend-framework2 doctrine

我对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值。请帮忙。

2 个答案:

答案 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();

这是您指定的过程吗?谢谢你的帮助。