尝试在保存时保存 CakePHP HABTM 关系中的重复关联

Posted

技术标签:

【中文标题】尝试在保存时保存 CakePHP HABTM 关系中的重复关联【英文标题】:Trying to save duplicate associations in CakePHP HABTM relationship on save 【发布时间】:2014-08-27 05:23:39 【问题描述】:

我也很想知道这个问题的答案 - https://***.com/questions/24447879/cakephp-habtm-i-want-duplicates-at-save

关于 unique = false、saveAll saveAssociated、数组格式,我尝试了一些不同的方法。没运气。

我的具体示例是传递这个数据数组,我在我的 AvailablePackageController 中使用 saveAll:

'AvailablePackage' => array(
    'title' => 'Tester',
    'description' => 'Tester description',
    'price' => '500.00',
    'image' => array(
        'name' => '',
        'type' => '',
        'tmp_name' => '',
        'error' => (int) 4,
        'size' => (int) 0
    )
),
'AvailableLesson' => array(
    'AvailableLesson' => array(
        (int) 0 => '23',
        (int) 1 => '23',
        (int) 2 => '23',
        (int) 3 => '9',
        (int) 4 => '9'
    )
)

如您所见,我希望此可用包将可用课程“23”关联 3 次。在一个包中,您可以将相同的课程重复 3 次(在这种情况下)。

HABTM 设置正确,一切正常。在上面,它保存了 2 行,其中 23 行,9 行。所以在配置关系时没有问题。它只是不会保存重复项。

任何帮助将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

这是一个复杂的 HABTM 关系

它是alluded to in the docs:

默认情况下,当保存 HasAndBelongsToMany 关系时,CakePHP 将在保存新行之前删除连接表上的所有行。例如,如果您有一个关联了 10 个孩子的俱乐部。然后,您使用 2 个孩子更新 Club。俱乐部只有 2 个孩子,而不是 12 个。

不要为此使用 HABTM,将连接表设为模型

habtm 关系很简单:

Thing <-has and belongs to many-> OtherThing

如果两个模型之间的链接数量有一定的意义,那么几乎可以肯定它是 不是简单的 HABTM 关系,实际上是其他东西,例如

竞争有很多赢家 获胜者属于比赛 获胜者属于用户 获奖者属于奖品 (获胜者有财产位置) 用户有很多奖

在这种情况下,将连接表设为模型,将其视为 hasMany 关系,使用 HABTM 操作数据的问题就烟消云散了。

仍然可以在需要和适当的时候使用 HABTM 关系。

【讨论】:

感谢 AD7six,我理解您的意思,并且已经有了一个模型,我将其用于管理方面。我直接通过 AvailableLessonsAvailablePackages 模型进行了测试,可以添加我所追求的场景。我很难弄清楚如何直接从 AvailablePackages 模型中使用 HABTM 模型。我设置为 HABTM 还是 HasMany?在那之后数组结构可能需要看起来像什么。如果你有一个很棒的链接! Do I set up as HABTM or HasMany? 看来您还没有理解答案 =)。我已经改写了它以进一步强调。 谢谢先生。我今晚试试。非常感谢。 雅虎!像魅力一样工作。不得不稍微改变数组结构(对于 hasMany),但很好。谢谢!数据[AvailableLessonsAvailablePackages][][available_lesson_id] 我相信文档所说的不能用来证明使用两个“hasMany”的合理性。但是“hasMany”替代方案确实解决了这个问题。【参考方案2】:

有一个名为 availablelessons_availablepackages 的单独表,您需要使用外键和关联外键为 AvailableLesson 和 AvailablePackage 模型定义 HABTM,然后您可以保存。所有保存的数据都将在 availablelessons_availablepackages 表中。

【讨论】:

FMQB,我也玩过这个选项。我认为在这种情况下,HABATM 的工作是有意义的。但是,一旦通过我的系统预订了 AvailablePackage,你的理论就会更有效,将其变成带有课程关联的 Package。

以上是关于尝试在保存时保存 CakePHP HABTM 关系中的重复关联的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP HABTM 关系保存新的关联

在 CakePHP 中使用 HABTM 保存 hasOne

在 HABTM 的情况下,CakePHP 不会保存正确的数据

cakephp 在不使用视图的情况下保存 HABTM 关系的数据

CakePHP 保存 HABTM 数据

CakePHP 2.5 habtm 不保存