【问题标题】:CakePHP 2.5 habtm does not saveCakePHP 2.5 habtm 不保存
【发布时间】: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
                            )

                    )

            )
    )

【问题讨论】:

    标签: cakephp has-and-belongs-to-many


    【解决方案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 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 2013-09-24
      • 2012-08-08
      • 2010-12-18
      • 1970-01-01
      相关资源
      最近更新 更多