如何将数据插入不同的表

时间:2018-12-05 21:17:00

标签: php cakephp

我正在使用CakePHP来学习它。我已经以商品形式创建了一个具有关联关系products/categories的CRUD,我要放置一个名为tags的字段,并用逗号分隔,并将每个分隔的标签插入另一个表中。例子。

表单产品(输入:标签)

one,two,four

标签(表格)

id | product_id | tag
1       2         one
2       2         two

我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

您需要做的是在修改实体之前先修改数据。幸运的是,有一个Model.beforeMarshal事件,它使您可以执行此操作。下面是一个未经测试的快速示例:

//put this in your Table class
public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options){
    if(!empty($data["tag_string"]){
        $tags = explode(", ",$data["tag_string"]);
        $tagsData = [];
        foreach($tags as $tag){
            $tagsData[] = ["tag" => $tag];
        }
        $data["tags"] = $tagsData;
    }
}

请注意,我将tags更改为tag_string-这是因为tags(如果您遵循CakePHP约定)将保留给您的关联。另外,默认情况下,您的标签将添加到现有标签的后面,因此您需要使用关联定义中的"saveStrategy" => "replace"更改保存策略。

您还需要检索标签字符串-为此,您需要在实体中创建虚拟属性:

//put this in your Entity
protected function _getTagString(){
    $tagString = "";
    for($i = 0; $i < count($this->tags); $i++){
        $tagString .= $this->tags[$i]->tag;
        if($i != count($this->tags) - 1){
            $tagString .= ", ";
        }
    }
    return $tagString;
}

这样,您就可以通过调用$product->tag_string来检索标签字符串。

更多信息可以在CakePHP食谱中找到:

Modyfying request data before building entities

HasMany Association

Virtual Properties