CakePHP 2.5 habtm 不保存

Posted

技术标签:

【中文标题】CakePHP 2.5 habtm 不保存【英文标题】:CakePHP 2.5 habtm does not save 【发布时间】:2014-10-24 21:43:42 【问题描述】:

我知道这个特定问题有很多问题,官方文档中有示例。但我找不到我做错了什么。

我有两个具有 HABTM 关系的模型,但显然它没有在连接和最终表中保存任何内容。这些是我要保存的表格、模型和数组。

表格

冠军表:

CREATE TABLE `champions` (
 `id` int(11) unsigned NOT NULL,
 `key` varchar(50) DEFAULT NULL,
 .
 .
 .
 `created` datetime NOT NULL,
 `modified` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

champions_tags 表:

CREATE TABLE `champions_tags` (
 `id` int(11) NOT NULL,
 `champion_id` int(11) NOT NULL,
 `tag_id` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

标签表:

CREATE TABLE `tags` (
 `id` int(11) NOT NULL,
 `type` varchar(50) DEFAULT NULL,
 `created` datetime NOT NULL,
 `modified` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

模型

Champion.php

public $hasAndBelongsToMany = array(
    'Tag'   =>  array(
                'foreignKey'            =>  'champion_id',
                'associationForeignKey' =>  'tag_id',
                'unique'                =>  'keepExisting'
     )
);

标签.php

    public $hasAndBelongsToMany = array(
        'Tag'  =>  array(
            'foreignKey'            =>  'tag_id',
            'associationForeignKey' =>  'champion_id',
            'unique'                =>  'keepExisting'
        )
    );

最后,这是我要保存并传播到标签表的信息

    Array
    (
        [Champion] => Array
            (
                .
                .
                .
                [Tag] => Array
                    (
                        [0] => Array
                            (
                                [id] => 2660
                                [type] => Fighter
                            )

                        [1] => Array
                            (
                                [id] => 2661
                                [type] => Tank
                            )

                    )

            )
    )

【问题讨论】:

【参考方案1】:

在 CakePHP 2.x 中,HABTM 很棘手。了解它的工作原理绝非易事,尤其是在保存数据方面。

对于您的情况,您的数据应如下所示:

<?php
$this->Champion->save([
    'Champion' => [
        'key' => 'championKey',
    ],
    'Tag' => [
        'Tag' => [2660, 2661],
    ],
]);

如果你想关联一个还不存在的标签怎么办?您必须先创建它,然后将其 id 添加到 $data['Tag']['Tag'] 列表中。

你可以同时保存一个英雄并创建一个新标签,但不幸的是它必须一个一个完成:

<?php
$this->Champion->save([
    'Champion' => [
        'id' => 1,
    ],
    'Tag' => [
        'type' => 'new type 1',
    ]
]);
$this->Champion->save([
    'Champion' => [
        'id' => 2,
    ],
    'Tag' => [
        'type' => 'new type 2',
    ]
]);
$this->Champion->save([
    'Champion' => [
        'id' => 2,
    ],
    'Tag' => [
        'type' => 'new type 3',
    ]
]); // /!\ Champion #2 is not tagged with 'new type 2' anymore!

你可以找到所有这些信息in the docs :)

【讨论】:

以上是关于CakePHP 2.5 habtm 不保存的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 和 HABTM 插入/保存不起作用

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

CakePHP 我应该在 HABTM 关系中使用 keepExisting 吗?

Cake 2 复杂 habtm 关系的数据模型 - 保存和加载

CakePHP - 保存 HABTM

HABTM 关联未保存 - cakephp