我得到了这些桌子:
目前,我已在添加或编辑评论时进行了插入。 在我的 Tag 表类中,扩展自 Zend_DB_Table... 插入在某些情况下有效,但随后失败并出现 SQL 错误“ SQLSTATE[23000]:完整性约束违规:1452”
public function insertTags($reviewId, $tagList) {
$reviewTag = new Application_Model_DbTable_ReviewTag;
$tags = explode(self::SEPERATE, $tagList);
foreach ($tags as $tag) {
$tag = trim($tag);
$tagRow = $this->fetchRow(array('tag = ?' => $tag));
if ($tagRow == null) {
$tagId = $this->insert(array(
'tag' => trim($tag)
));
$reviewTag->insert(array(
'Tag_ID' => $tagId,
'Review_ID' => $reviewId,
));
}
}
}
所以问题是:
“SQLSTATE[23000]:违反完整性约束:1452”
如果我必须在没有堆栈跟踪的情况下进行猜测,我会说以下行是问题所在:
$tagId = $this->insert(array(
'tag' => trim($tag)
));
$tagId = $this->insert(array(
'tag' => trim($tag)
));
我假设您对标签表有一个唯一的约束,以确保重复的标签不会添加到表中。
问题是这一行不应该是插入,它应该是 getTagIDByTag,如果失败,则插入。 所以,
public function insertTags($reviewId, $tagList)
{
$reviewTag = new Application_Model_DbTable_ReviewTag;
$tags = explode(self::SEPERATE, $tagList);
foreach($tags as $tag)
{
$tag = trim($tag);
$tagRow = $this->fetchRow(array('tag = ?' => $tag));
if($tagRow == null)
{
// FIRST TRY TO GET THE TAG
$tagId = $db->fetchCol('SELECT Tag_ID FROM Tag WHERE tag = ?', trim($tag));
// ZEND RETURNS NULL IF THE QUERY DOESN'T RETURN ANYTHING
if(is_null($tagId))
{
// CREATE THE TAG
$tagId = $this->insert(array(
'tag' => trim($tag)
));
}
$reviewTag->insert(array(
'Tag_ID' => $tagId, // USE THE TAG ID LIKE NORMAL
'Review_ID' => $reviewId,
));
}
}
}
我已经通过这段代码解决了我的解决方案。如果在编辑时删除或添加了标签,还可以处理问题。
public function insertTags($reviewId, $tagList)
{
$reviewTag = new Application_Model_DbTable_ReviewTag;
$tags = explode(self::SEPERATE, $tagList);
foreach($tags as $tag)
{
$tag = trim($tag);
$tagRow = $this->fetchRow(array('tag = ?' => $tag));
if($tagRow == null)
{
// FIRST TRY TO GET THE TAG
$tagId = $db->fetchCol('SELECT Tag_ID FROM Tag WHERE tag = ?', trim($tag));
// ZEND RETURNS NULL IF THE QUERY DOESN'T RETURN ANYTHING
if(is_null($tagId))
{
// CREATE THE TAG
$tagId = $this->insert(array(
'tag' => trim($tag)
));
}
$reviewTag->insert(array(
'Tag_ID' => $tagId, // USE THE TAG ID LIKE NORMAL
'Review_ID' => $reviewId,
));
}
}
}