【问题标题】:Saving Tags in the Database在数据库中保存标签
【发布时间】:2011-07-20 07:05:59
【问题描述】:

我正在尝试在我的应用程序中实现标签。

tags(id, name)
tags_relations (id, tag_id, entity_id)
entity (id, name)

这里我有一组 4 个标签,我想将其显示为一个类别

菜式 -> 早餐、午餐、晚餐、小吃

实际上是可以为特定实体选中或取消选中的标签。

在另一个字段中,我允许用户输入逗号分隔的标签。

我只是想知道将它保存到数据库中的最佳方法是什么?

我正在使用 CakePHP 框架..

【问题讨论】:

标签: php cakephp model tags tagging


【解决方案1】:

遵循蛋糕标准:

tags(id, name)
tags_entities (id, tag_id, entity_id)
entities (id, name)

再次烘烤 3 张桌子,蛋糕会自动分配正确的关系。自动生成的代码将让您检查和取消选中标签。如果你想“允许用户输入逗号分隔的标签”,你需要编写更多的代码来处理它。

【讨论】:

  • 这个逻辑代码应该放在标签模型还是控制器中? bcos我想检查标签是否存在获取id并插入,否则必须插入标签并获取id然后插入关系
  • 理想情况下,您执行所有数据库操作的模型。控制器只是简单地指导控制流而不知道数据库细节。您可以在 Tag 模型中编写方法 findIDs($tags_str)。并从实体模型中的 saveEntity() 调用它以获取标签 ID 列表。在 findIDs() 方法中,还可以有“如果不存在则插入”的逻辑
  • @Harshana:您不必担心,CakePhp 会自动处理。请参阅 Juhana 对您的问题的评论,第二个链接
  • @kaklon 这是添加一个新标签的示例,不是逗号分隔的列表,也没有“如果不存在则插入”逻辑。
  • @Anh Pham:没错,我跳过了逗号分隔的列表。尽管如此,它只会在标签不存在时插入标签,如果存在则自动检索id。
【解决方案2】:

连接表应该命名为entities_tags:

连接表的名称需要包含所涉及的两个模型的名称,按字母顺序排列,并用下划线 (_) 分隔

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    相关资源
    最近更新 更多