CakePHP beforeSave& HABTM

时间:2011-08-12 22:08:32

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

我正在尝试在CakePHP 2.0 beta中编写一些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
                        )

                )

        )

)

它还成功地将数据保存在主模型(Project)中。但是[Term] [Term]下的协会被忽略了。我很确定这是保存HABTM关联的正确数组结构。

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

1 个答案:

答案 0 :(得分:0)

在视图中,您应该有1个输入文本$form->input('terms');,以便用户可以输入所有标记。所以在beforeSave中,你会有一串标签(或术语),你可能想要将它切片到数组,查找('list')这些术语,以及某些数组相交或其他什么。但最后,您需要使用saveAll:

这样的数据
Array
(
[Project] => Array
    (
        [id] => 2
        [title] => Project Title
        ...
    )
[Term] => Array
    (
        [Term] => Array
            (
                [0] => 10 // id of the tag
                [1] => 2
            )
    )