CakePHP HABTM与同型号外键的关系

时间:2013-05-09 09:04:37

标签: cakephp

我有一个与自身有HABTM关系的模型'Catgeory'

public $hasAndBelongsToMany = array(
        'SubCategory' => array(
            'className' => 'Category',
            'joinTable' => 'categories_subcategories',
            'foreignKey' => 'category_id',
            'associationForeignKey' => 'subcategory_id',
            'unique' => 'keepExisting',
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
            'deleteQuery' => '',
            'insertQuery' => ''
        )
    );

这是我用来保存类别的代码。我想创建一个关系,使这个类别成为父类的子元素($ id)

$this->Category->create();
$c["Category"]["title"] = $this->request->data["title"];
$c["SubCategory"]["CategoriesSubcategory"]["category_id"] = $id;

这种结构对我来说似乎是对的,但这并没有创造出这种关系。但是,如果我尝试使用

创建关系
$c["SubCategory"]["CategoriesSubcategory"]["subcategory_id"] = $id;

这确实有效,但是父母和孩子的方式是错误的。所以这告诉我,foreignKey和associationForeignKey是错误的方式。所以我在我的关系中改变了它们:

public $hasAndBelongsToMany = array(
        'SubCategory' => array(
            'className' => 'Category',
            'joinTable' => 'categories_subcategories',
            'foreignKey' => 'subcategory_id',
            'associationForeignKey' => 'category_id',
            'unique' => 'keepExisting',
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
            'deleteQuery' => '',
            'insertQuery' => ''
        )
    );

现在这意味着关系得到了妥善保存,但是,我认为这种关系是错误的方式,因为当我找到所有类别时,孩子们不再在结果中出现。

我出错的任何想法?我节省了什么错吗?我需要创建一个模型SubCategory吗?

1 个答案:

答案 0 :(得分:0)

我认为你不应该使用HABTM关系 - 但这只是一种意见。

类别可能有许多子类别,因此类别模型必须具有hasMany关系,该关系使用外键parent_id链接到同一个表。

一个子类别总是只有一个父类(不是吗?)所以可以用关系belongsTo创建一个模型。

通过这种方式,您可以轻松地将类别和子类别保存在一起,并准确检索您所需的内容。这样你也可以摆脱HABTM所需的关系表,只需要在类别表中另一列名为parent_id的列:)