CakePHP - HABTM - 将多个标签添加到多个点

Posted

技术标签:

【中文标题】CakePHP - HABTM - 将多个标签添加到多个点【英文标题】:CakePHP - HABTM - adding multiple tags to multiple points 【发布时间】:2010-02-17 00:45:27 【问题描述】:

我正在尝试使用多个标签来“标记”多个“点”。我成功地标记了我的单点。不幸的是,当我尝试在另一个点上使用标签(例如“test2”)作为标签时,如果我将“唯一”设置为 false 或“唯一”设置为 true,则会出现重复输入错误,它将删除“test2”的所有其他点的我的标签并创建一个新的。

这是我的帖子数据:

Array
(
    [Tag] => Array
        (
            [id] => 4b7af6d7-787c-4f10-aa49-2502c0a80001
            [name] => Test2
        )

    [Point] => Array
        (
            [id] => 4b47c66f-a130-4d12-8ccd-60824051e4b0
        )

)

在我的标签模型中,我有这个:

public $hasAndBelongsToMany = array(

'Point' => array(
        'className' => 'Point',
        'joinTable' => 'points_tags',
        'foreignKey' => 'tag_id',
        'associationForeignKey' => 'point_id',
        'unique' => false)
);

我也尝试过将 'unique' 设置为 true。不幸的是,这将删除连接表 ('points_tags') 中的任何其他“Test2”实例。

我已经使用 save() 和 saveAll() 尝试过这个。两者都给我这个错误:

警告 (512):SQL 错误:1062:重复条目 '4b7af6d7-787c-4f10-aa49-2502c0a80001-4b47c66f-a130-4d12-8ccd-608' 键 'MAN_ADD' [CORE/cake/libs/model/数据源/dbo_source.php,第 527 行] 查询:插入points_tagstag_idpoint_idid)值('4b7af6d7-787c-4f10-aa49-2502c0a80001','4b47c66f-a130-4d12-8ccd-60824051e4b0','4b7b39f3-46f8 -4744-ac53-3973c0a80001')

想法????

建议????

【问题讨论】:

【参考方案1】:

id 来自哪里?我猜它是表的主键,从我从你的帖子中了解到的(请写得更清楚,帮助我们帮助你)问题不在于点或标签,而在于 points_tags 表中的 id。

【讨论】:

你说的id要么是tag_id,要么是point_id。 tag_id 来自标签(如果它已经存在),而 point_id 是我要标记的项目的 id。我心中的问题是,如果另一个项目中已经存在一个条目,那么 points_tags 条目就会被覆盖。例如:点'a'有一个标签——测试如果我也想要标签点'b'和标签'test',它将删除points_tags中带有标签'test'的点'a'的当前条目并插入一个条目对于带有标签“测试”的点“b”。因此删除任何以前与“测试”建立的关联。这对你来说清楚了吗?【参考方案2】:

当您使用 save 方法时,您是在循环中执行它吗?请记住,最佳做法是在循环保存时调用 model::create()。

我经常发现,当我遇到 HABTM 保存行为问题时,是因为我没有调用 model::create。

【讨论】:

我实际上正在这样做。问题是我的保存首先从我的连接表中选择我所有的 tag_id,然后删除所有这些。或者,它应该根据我的 tag_id 和 point_id 从我的连接表中选择所有。

以上是关于CakePHP - HABTM - 将多个标签添加到多个点的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据写入 CakePHP 中 HABTM 连接表的 HABTM 关联?

在 CakePHP 中使用 HABTM 保存 hasOne

CakePHP 使用 saveAll:如何使用 HABTM 链接记录保存额外数据?

CakePHP 2.9 将 CSV 字符串转换为 HABTM 数据

Cakephp 2.2.3 habtm 保存到中间表

是否可以使用 Cakephp 中的 saveAll 一次将所有相关记录插入到 HABTM 中?