我想为文章帖子实现标记功能,因此用户可以在发布文章时添加多个标记。
我有一个tags
表,一个articles
表和一个article_tags
表。
标记:
id | tag (Unique)
文章:
id | title | content
article_tags:
id | article_id | tag_id
所以(1)当要插入新文章时,我需要插入articles
表并获取插入ID为article_id
。
(2)然后,我使用单个INSERT IGNORE
语句将多个标记插入tags
表。在这些标签中,有些可能存在并将被忽略。
(3)现在我要用article_tags
插入文章和标签的关系。但是,如何在步骤(2)中将ID作为tag_id
用作最后一个表?
或者我不能(相反,使用逐个插入解决方案)?
答案 0 :(得分:1)
@ AdrienXL的回答是一对一的解决方案。
我发现我可以先用INSERT IGNORE
批量插入标签。
当我插入article_tags
的关系时,我可以使用"批量选择"查询以获取ID。因此,我不一定需要手动获取和存储标签' tags
表中的ID。
伪SQL希望:
INSERT IGNORE tags (tag) VALUES [the tag array]
并且
INSERT INTO article_tags (tag_id, article_id)
SELECT id, [some_article_id] FROM tags WHERE tag IN [the tag array]
答案 1 :(得分:0)
型号:
public function insert_articles($data)
{
$this->db->insert('articles', $data);
return $this->db->insert_id();
}
public function insert_tags($data)
{
$insert_query = $this->db->insert_string('tags', $data);
$insert_query = str_replace('INSERT INTO','INSERT IGNORE INTO',$insert_query);
$this->db->query($insert_query);
return $this->db->insert_id();
}
public function insert_article_tags($data)
{
return $this->db->insert_batch('articles_tags', $data);
}
控制器:
public function myfunction()
{
$id_article = $this->my_model->insert_articles($data);
$article_tags = array();
foreach($mytags as $t)
{
$id_tag = $this->my_model->insert_articles($data);
array_push($article_tags, array("id_article" => $id_article, "id_tag" => $id_tag));
//Supposed two fields table : id_article | id_tag
}
$this->my_model->insert_article_tags($data);
}