大量のデータを含む「AddOns」のモデルがあります。また、SO のように通常の方法で機能するタグもあり、コンマ区切りのリストから最大 5 つのタグを使用できます。
私が作成しようとしている動作は次のとおりです。
- ユーザーがアドオンを作成
- アドオンが作成されました
- システムはタグを配列に分割し、それらをループします
- システムがタグを検索し、存在する場合はその ID を使用します
- タグが存在しない場合は、タグを作成してその ID を使用します
- タグとアドオンの間にリンクを作成する
手動クエリを使用してこれを非常に簡単に行うことができますが、それが最善の方法であるか、どのようにアプローチすべきかはわかりません。これが私のコードです:
if ($this->request->is('post')) {
$this->AddOn->create();
$this->AddOn->set('user_id', $this->Auth->user('id'));
if ($this->AddOn->save($this->request->data)) {
// Get the ID of the addon
$addon_id = $this->AddOn->getInsertID();
$tagsarr = explode(',', $this->request->data['Tag']['Tag']);
foreach($tagsarr as $tag){
$tagdb = $this->Tags->findByTagName(trim($tag));
if(!empty($tagdb)){
// HELP! We have a tag, but how do we add the link?
} else {
// Add the tag, but then how do we link it?
}
unset($tagdb);
}
$this->Session->setFlash(
__('The %s has been saved', __('add on'))
);
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(
__('The %s could not be saved. Please, try again.', __('add on')),
);
}
}
編集:私が達成しようとしていることのいくつかの疑似コードを以下に追加しました。
$AddOn->create();
$AddOn->save(); // Create AddOn
$AddOnID = $AddOn->insertId(); // Newly inserted AddOn's ID
$tagsArr = explode(',', $post->tags); // Make an array of tags [this,is,a,tag,list]
foreach($tagsArr as $tag){ // Loop through them
$tagFromDb = $Tags->findTagByName($tag); // Try and find the tag from the tags table
if(!$tagFromDb){ // Have we found it? No
$tagId = $Tags->newTag($tag); // Add it and reference
} else { // Have we found it? Yes
$tagId = $tagFromDb->id; // Reference it
}
$AddOnTagsLink->addAddOnTagsLink($AddOnID, $tagId); // Add the link
}