我们正计划使用类似于在该站点上实施的标记系统。
我们有实际的标记前端,自动完成等工作。
但我对在后端处理它的最佳方式感到困惑。
基本上,当我们在后端获取标签时,我们最终会得到一个如下所示的数组:
array(
array(
'value' => 1,
'label' => 'First Tag'
),
array(
'value' => 2,
'label' => 'Second Tag'
),
array(
'value' => 'Third Tag',
'label' => 'Third Tag'
),
array(
'value' => 3,
'label' => 'Fourth Tag'
),
)
json_encode()
标记插件在自动完成时也会通过 ajax接收相同的数组格式,它会显示标签,并存储 id 以便可以将其发回。
因此,值为1
,2
的3
标签是从自动完成中选择的标签。
值为 的标签Third Tag
是未从自动完成中选择的标签,它可能已存在或可能不存在于数据库中,但已手动输入。
现在有一个变化,用户实际上可以创建一个恰好是数字的标签,因此
array(
'value' => 3,
'label' => 3
)
可以通过,但不存在,所以我们不能假设如果 value 是 int 那么它已经存在。
所以,这个问题的第一部分是,我如何管理这个,这样我就不会得到重复的标签?
我目前的方法是,当标记插件通过自动完成请求标记时,我发回一个数组,例如
(术语='别针')
array(
array(
'value' => '||1',
'label' => 'pink'
),
array(
'value' => '||4',
'label' => 'pin cushion'
)
)
然后在后端假设任何具有以 || 开头的值的标签 来自自动完成并且已经存在。
然后,我们查询数据库中的所有标签,我们检查其余的标签以找出value
数组的label
键是否存在,如果存在,我们就保持原样,如果不存在,我们创建它,然后我们用id
原始数组中的新值切换出值。
但这对我来说感觉很奇怪,这意味着我们正在使用填充项(||
)必须有一种更优雅的方式来做到这一点?
问题的下一部分是,实际上将这些标签链接到一个项目。这更多是在本网站上编辑问题的背景下,
一些标签已经与问题相关联。你如何处理它,这样你就不会在一个问题上出现重复的标签引用?
到目前为止,我看到了两个选项:从问题中删除所有指向标签的链接,然后再次将它们全部插入。(2 个查询)
或
在数据库中查询连接到问题的所有标签,遍历数组,从数组中删除这些标签,然后插入剩余部分。(2 个查询)
任何一种方法都比另一种更好吗?还是有第三个版本?