cakephp habtm关系(保存数据)

cakephp habtm关系(保存数据),php,cakephp,has-and-belongs-to-many,relationship,Php,Cakephp,Has And Belongs To Many,Relationship,有关HABTM的问题已经在stackoverflow上发布了很多,但我仍然在寻找解决问题的方法 我正在创建一个应用程序,允许基于特定子类别创建主题。 添加主题时,会要求用户提供标签(在同一表单上)。现在,当用户在单击“添加”按钮时完成向主题添加标记时,主题已成功添加,但标记未成功添加 我已经为主题和标记创建了join表,作为tbl\u tags\u topics.(按照cakephp的约定定义),并在主题和标记的模型中正确地定义了“hasandbelongtomany”数组 我现在错过了什么步骤

有关HABTM的问题已经在stackoverflow上发布了很多,但我仍然在寻找解决问题的方法

我正在创建一个应用程序,允许基于特定子类别创建主题。 添加主题时,会要求用户提供标签(在同一表单上)。现在,当用户在单击“添加”按钮时完成向主题添加标记时,主题已成功添加,但标记未成功添加

我已经为主题和标记创建了join表,作为
tbl\u tags\u topics.
(按照cakephp的约定定义),并在主题和标记的模型中正确地定义了“hasandbelongtomany”数组

我现在错过了什么步骤

我还有一个与此相关的问题,但当我能够成功地将与主题相关的标记发送到数据库时,我将发布它。(功能类似于stackoverflow的标签添加和附加功能)

非常感谢您的帮助。如果您找到任何关于HABTM的好教程,请告诉我


谢谢

当您保存其中一个字段时,会传递如下参数:

$this->Model->save(
    'Model' => array('id' => 1, 'name' => 'one random field)
);
如果您有标签(即HABTM),您可以执行以下操作:

$this->Model->save(
    'Model' => array('id' => 1, 'name' => 'one random field'),
    'Tag' => array('Tag' => array(1))
);
但是,此本机功能存在一个问题,即每次保存对象时,都需要将每个标记传递给保存的数组。否则,它们将在重新读取之前全部删除

然而,你可以在bakery上找到一个名为的插件

使用它,您将执行以下操作:

$this->Model->habtmAdd('Tag', 1, 1);
其中,第一个“1”是模型的对象id,第二个是标记的对象id

要删除标记,请执行以下操作:

$this->Post->habtmDelete('Tag', 1, 1); 
在先生的帮助下,我解决了我的问题。下面是描述如何在cakephp中实现此类功能的完整过程的示例。这是一个非常棒的教程,可以了解更多关于HABTM关系的信息

对于1.3版,我发现这种技术很有用。以下是步骤:

在两个模型中定义HABTM关系数组后

像这样创建表单

echo $form->create('Job');
echo $form->input('title');
echo $form->input('description');
echo $form->input('location');
echo $form->input('Category');//note the caps and single plural
$form->end('Submit');
然后在控制器add方法中,只需使用

saveAll($this->data)

连接表也将填充所需的记录


您正在使用安全组件吗?不,我现在没有使用任何安全组件。完成此(HABTM)功能后,将实现它(Auth)。我添加了“extend_associations.php”,现在我收到以下警告:“警告(2):为foreach()提供的参数无效[CORE\Cake\Utility\ObjectCollection.php,第314行]”。我使用的是cakephp 2。@matheusvmbruno这里也是,你解决这个问题了吗?@matheusvmbruno好的,我刚刚解决了这个问题。我想这与新的cakephp约定有关。1.模型中$actsAs属性中对行为类的引用必须包装在数组中(这就是为什么foreach循环的参数无效,因为它需要一个数组)。2.还会出现其他警告,建议将extend_associations.php文件名更改为根据传入$actsAs属性(例如extendaassociations.php)的值设置的文件名。