Как разделить теги HABTM?

Я хочу взять поле в форме добавления сообщения, разбить его на пробелы и сохранить каждое слово как тег, который имеет сообщение HasAndBelongsToMany. Таким образом, для каждого нераспознанного тега будет создан новый, но если тег уже существует, будет создана только новая ссылка в таблицах posts_tags. Я пытался использовать saveAll, saveAssociated и несколько взломов foreach, и я не совсем уверен, где что-то пошло не так, но я не могу понять, как сохранить ассоциированные данные. Приветствуется любое описание того, как получить данные тега из формы в базу данных.

//in model
public function parseTags($data) {
    $str = $data['Tag'][0]['title'];
    $tags = explode('',$str);
    for ($i=0; $i<count($tags); $i++) {
        $data['Tag'][$i]['title'] = $tags[$i];
    }
    return $data;
}

//in view
echo $this->Form->input('Tag.0.title',array('label'=>'Tags'));

//in controller
public function add() {
    if ($this->request->is('post')) {
        $this->Question->create();
        $this->request->data['Question']['user_id'] = $this->Auth->user('id');
        $this->request->data = $this->Question->parseTags($this->request->data);
        if ($this->Question->saveAll($this->request->data)) {
            $this->Session->setFlash(__('The question has been saved'), 'default', array('class' => 'success'));
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The question could not be saved. Please, try again.'));
        }
    }
    $users = $this->Question->User->find('list');
    $this->set(compact('users'));
}

person tyjkenn    schedule 16.05.2012    source источник


Ответы (1)


Вы должны сначала проверить, был ли тег сохранен ранее или нет, если он не сохранен, вы можете сохранить его. Поэтому, прежде чем вы сохраните свою модель, все ваши теги будут сохранены ранее.

что-то вроде этого:

/* $tag_list is exploded tags*/

        foreach ($tag_list as $tag) {
            $res = $this->Tag->find('first', array('conditions' => array('Tag.name' => $tag)));
            if ($res != array()) {
                $tag_info[] = $res['Tag']['id'];
            } else {
                $this->Tag->create();
                $this->Tag->save(array('Tag.name' => $tag));
                $tag_info[] = sprintf($this->Tag->getLastInsertID());
            }


        }
        $this->model->data['Tag']['Tag'] = $tag_info;
person Arash Mousavi    schedule 18.08.2012