我正在开发一个项目,我试图在用户提交帖子时从帖子中获取主题标签。然后我将匹配项放入数据库以供参考。我的问题是,有更有效的方法吗?我当前的代码运行的查询太多,导致发布时间变慢。
代码循环遍历每个标记,并检查它是否存在于数据库中,如果它只是添加引用标记的项目,如果它不存在则将标记添加到数据库并添加引用标签和帖子。
我试过这个,但不知道我可以用相同的功能改进它
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) );
}
}
答案 0 :(得分:2)
不要在查询中直接比较您的代码。我建议将所有标签放在一个数组中,然后使用in_array
函数进行检查。它会更快。
如果您想进行查询比较,请在标记列中添加索引,以便更快地进行比较。
说明:(简要)
通过查询表将所有标签放入php数组中。为此,查询应该没有任何条件,例如
$tag = DB::query('SELECT * FROM tags')[0];
如果没有将查询结果转换为数组,则将其存储到同一个数组中,例如
$tag = $tag->toArray();
然后遍历输入数组标记以检查它们是否存在:
$filteredArray = array();
$newTags = array();
foreach($hashtags as $t) {
if(in_array($t, $tag))
{
$filteredArray[] = $t;
}
else {
$newTags[] = $t;
}
}
然后使用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.
}
注意:这是一个非常简短的想法。您应该更正条件并正确设置。