【问题标题】:CakePHP beforeSave & HABTMCakePHP beforeSave & HABTM
【发布时间】:2011-08-12 22:08:32
【问题描述】:

我正在尝试在 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
                        )

                )

        )

)

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

有人知道这有什么问题吗?

【问题讨论】:

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


    【解决方案1】:

    在视图中,您应该有 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
                )
        )
    

    )

    【讨论】:

    • 我实际上并没有使用表单助手,但字段看起来像这样:<input type="text" id="Term0Name" name="data[Term][0][name]" value="">
    • PS 这就是我不使用表单助手的原因:groups.google.com/group/cake-php/browse_thread/thread/…
    • 你不必循环(蛋糕书中的例子没有循环)。可能是因为你这样做了,所以数据没有保存。
    • 我想我没有解释我做得很好,但是循环是在保存之前将输入中的文本(标签的名称)转换为ID,所以理论上它可以使用 Cake 的默认 save() 函数,该函数需要 ID
    • 我说的是 google 群组链接中的循环,而不是 beforeSave() 中的循环。但是我确实错过了您对新术语的看法(或者是标签?)。无论如何,我会编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多