循环遍历字符串中的主题标签并插入数据库

时间:2018-04-26 06:57:18

标签: php mysql sql

我正在开发一个项目,我试图在用户提交帖子时从帖子中获取主题标签。然后我将匹配项放入数据库以供参考。我的问题是,有更有效的方法吗?我当前的代码运行的查询太多,导致发布时间变慢。

代码循环遍历每个标记,并检查它是否存在于数据库中,如果它只是添加引用标记的项目,如果它不存在则将标记添加到数据库并添加引用标签和帖子。

我试过这个,但不知道我可以用相同的功能改进它

foreach($hashtags as $tag){
  if(DB::query('SELECT * FROM tags WHERE tag=:tag', array(':tag' => $tag))){
    $tag = DB::query('SELECT * FROM tags WHERE tag=:tag', array(':tag' => $tag))[0];
    DB::query ( "INSERT INTO post_tags VALUES(:tagid, :postid)", array (':tagid' => $tag['id'], ':postid' => $postid) );
  }else{
    $id = hash(sha256, $tag);
    DB::query ( "INSERT INTO tags VALUES(:id, :tag, :mode)", array (':id' => $id, ':tag' => $tag, ':mode' => 0) );
    DB::query ( "INSERT INTO post_tags VALUES(:tagid, :postid)", array (':tagid' => $id, ':postid' => $postid) );
  }
}

1 个答案:

答案 0 :(得分:2)

不要在查询中直接比较您的代码。我建议将所有标签放在一个数组中,然后使用in_array函数进行检查。它会更快。

如果您想进行查询比较,请在标记列中添加索引,以便更快地进行比较。

说明:(简要)

  1. 通过查询表将所有标签放入php数组中。为此,查询应该没有任何条件,例如

    $tag = DB::query('SELECT * FROM tags')[0];
    
  2. 如果没有将查询结果转换为数组,则将其存储到同一个数组中,例如

    $tag = $tag->toArray();
    
  3. 然后遍历输入数组标记以检查它们是否存在:

    $filteredArray = array();
    $newTags = array();
    
    foreach($hashtags as $t) {
        if(in_array($t, $tag))
        {
            $filteredArray[] = $t;
        }
        else {
            $newTags[] = $t;
        }
    }
    
  4. 然后使用insert query将匹配的标记插入到db中。

    if(!empty($allTags)) {
        $allTags = array_column($t,'id');
        DB::query ( "INSERT INTO post_tags VALUES(:tagid, :postid)", array (':tagid' => $allTags, ':postid' => $postid) );
    }
    else
    {
         // Otherwise get all the new tags and then insert them along with mode = 0 and create `post_tags` too.
    }
    
  5. 注意:这是一个非常简短的想法。您应该更正条件并正确设置。