我正在使用CakePHP来学习它。我已经以商品形式创建了一个具有关联关系products/categories
的CRUD,我要放置一个名为tags
的字段,并用逗号分隔,并将每个分隔的标签插入另一个表中。例子。
表单产品(输入:标签)
one,two,four
标签(表格)
id | product_id | tag
1 2 one
2 2 two
我不知道该怎么做。
答案 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食谱中找到: