任何优雅的解决方案如何插入多对多表?

问题描述 投票:0回答:2

我得到了这些桌子:

  • 标签 - 包含标签名称和 id (Tag_ID, tag)
  • TagReview - 标签和评论之间的链接表(Review_ID、Tag_ID)
  • 评论 - 保留评论。 (评论_ID、内容、...)

目前,我已在添加或编辑评论时进行了插入。 在我的 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,       
            ));
        }

    }
}
php zend-framework zend-db-table
2个回答
0
投票

所以问题是:

“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,       
            ));
        }
    }
}


0
投票

我已经通过这段代码解决了我的解决方案。如果在编辑时删除或添加了标签,还可以处理问题。

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,       
            ));
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.