这段代码可以优化或重构吗?这是标记的最佳方法吗?
以下代码是我的帖子模型中的回调。它创建一条记录,将标签与 QuestionsTags 联接器表中的帖子相关联。必要时,如果给定的标签不存在于 tags 表中,该函数会创建它,然后使用它的 id 在 QuestionsTags 表中创建新记录。
这种方法的困难在于 QuestionsTags 表取决于标签表中可能存在或不存在的数据。
该函数采用以下表格:
tags(id, tagName),
posts(tags) // Comma delimited list
questionsTags(postId, tagId)
这个想法是遍历与帖子一起提交的标签的分隔列表,并检查标签表中是否已经存在每个标签
如果标签存在:
- 检查在 QuestionTags 表中是否已有此帖子和此标签的 QuestionTag 记录。
- 如果是,什么都不做(关联已经存在)
- 如果否,则使用现有标签的 id 和 postId 创建一个新的 QuestionTag 记录
如果标签不存在:
- 在标签表中创建新标签
- 使用它的 id 创建一个新的 QuestionsTags 记录
代码
/**
* @hint Sets tags for a given question.
**/
private function setTags()
{
// Loop over the comma and space delmited list of tags
for (local.i = 1; local.i LTE ListLen(this.tags, ", "); local.i = (local.i + 1))
{
// Check if the tag already exists in the database
local.tag = model("tag").findOneByTagName(local.i);
// If the tag exists, look for an existing association between the tag and the question in the QuestionTag table
if (IsObject(local.tag))
{
local.questionTag = model("questionTag").findOneByPostIdAndTagId(values="#this.postId#,#local.tag.id#");
// If no assciatione exists, create a new QuestionTag record using the tagId and the postId
if (! IsObject(local.questionTag))
{
local.newQuestionTag = model("questionTag").new(postId = this.id, tagId = local.tag.id);
// Abort if the saving the new QuestionTag is unsuccesful
if (! local.newQuestionTag.save())
{
return false;
}
}
}
// If the tag does not exist create it
else
{
local.newTag = model("tag").new(tagName = local.i, userId = this.ownerUserId);
// Abort if the the new tag is not saved successfully
if (! local.newTag.save())
{
return false;
}
// Otherwise create a new association in the QuestionTags table using the id of the newly created tag and the postId
local.newQuestionTag = model("questionTag").new(postId = this.id, tagId = local.newTag.id);
// Abort if the new QuestionTag does not save correctly
if (! local.newQuestionTag.save())
{
return false;
}
}
}
}
仅供参考:我在我的应用程序中使用 CFWheels,它解释了使用的 ORM 函数。