CakePHP beforeSave&HABTM

CakePHP beforeSave&HABTM,php,cakephp,has-and-belongs-to-many,cakephp-model,Php,Cakephp,Has And Belongs To Many,Cakephp Model,我试图在CakePHP2.0测试版中编写一些beforeSave逻辑。基本上,我希望用户能够提交一些类似标签功能的文本。beforeSave函数将搜索相关表,如果标记存在,只需将其链接到主记录,如果不存在,则创建新标记,然后链接它 下面是我在beforeSave中的函数: function beforeSave() { if(!empty($this->data['Term']) && isset($this->Term)){ $terms =

我试图在CakePHP2.0测试版中编写一些beforeSave逻辑。基本上,我希望用户能够提交一些类似标签功能的文本。beforeSave函数将搜索相关表,如果标记存在,只需将其链接到主记录,如果不存在,则创建新标记,然后链接它

下面是我在beforeSave中的函数:

function beforeSave() {
    if(!empty($this->data['Term']) && isset($this->Term)){
       $terms = $this->Term->find('list');
       $terms = array_flip($terms);

       foreach($this->data['Term'] as $key => $term){
           if(!empty($terms[$term['name']])){
               $this->data['Term']['Term'][$key]['id'] = $terms[$term['name']];
               unset($this->data['Term'][$key]);
           }else{
               $this->Term->create();
               $this->Term->save(array('Term' => array('name' => $term['name'])));
               $this->data['Term']['Term'][$key]['id'] = $this->Term->id;
               unset($this->data['Term'][$key]);
           }
       }
   }

   return true;
}
这基本上按照我想要的方式工作,在必要时创建记录并查找现有记录,创建如下数组:

Array
(
    [Project] => Array
        (
            [id] => 2
            [title] => Project Title
            ...
        )

    [Term] => Array
        (
            [Term] => Array
                (
                    [0] => Array
                        (
                            [id] => 10
                        )

                    [1] => Array
                        (
                            [id] => 2
                        )

                )

        )

)
它还成功地将数据保存在主模型项目中。但[期限][期限]下的关联被忽略。我很确定这是保存HABTM关联的正确数组结构


有人看到这有什么问题吗?

在视图中,您应该有1个输入文本$form->input'terms';因此,用户可以输入所有标签。所以在beforeSave中,您将有一个标签或术语字符串,您可能希望将其切分到数组中,找到术语的“列表”,以及一些数组相交或其他内容。但最终,要使用saveAll,您需要数据看起来像这样:


实际上我并没有使用form helper,但字段看起来是这样的:PS这就是我不使用form helper的原因:您不必循环cake book中的示例没有循环。可能是因为你这样做了,数据没有保存。我想我没有解释我做得很好,但是循环是在保存之前将输入中的文本标记的名称转换为ID,因此理论上它将与Cake的默认保存功能一起工作,该功能期望IDsI在google groups链接中谈论循环,不是之前保存的那个。但我确实错过了你新学期的重点,或者是Tag?。无论如何,我会编辑我的答案。
Array
(
[Project] => Array
    (
        [id] => 2
        [title] => Project Title
        ...
    )
[Term] => Array
    (
        [Term] => Array
            (
                [0] => 10 // id of the tag
                [1] => 2
            )
    )