Отношения между нотами и теги


У меня 3 объекта и 3 модели. На заметку, есть много тегов, и каждый элемент должен иметь одну ноту. Итак, у меня есть note_tag_list для хранения тегов и заметок отношения.

Программа создает заметки с тегами.

Во-первых, я создаю объект записку, и положил его в модель. И я вернусь объекта из модели. Я создаю тег, если он не существует. Потом я прочитал снова тега объекта из БД. И использовать все теги и заметки для создания новых note_tag_list объект, и поместить этот объект в модель.

Но я думаю, что это кажется очень сложным для моего потока. Любые способы сделать это более элегантно? Спасибо.

//load all the object
$this->load->library('obj_note'); 
$this->load->library('obj_tag');  
$this->load->library('obj_note_tag_list'); 

//load all the model
$this->load->model('note_model');  
$this->load->model('tag_model');  
$this->load->model('note_tag_list_model'); 

//create a note object
$aNewUserNote    =new obj_note();

//set the object information
$user_id         =get_current_user_id();
$title           =$this->input->post('ui_title_input');
$content_url     =$this->input->post('ui_url_input');
$content         =$this->input->post('ui_textarea');
$right           =RIGHT_NOTE_PUBLIC;
$status          =STATUS_NOTE_ACTIVE;   

$aNewUserNote->set_user_id($user_id);
$aNewUserNote->set_title($title);
$aNewUserNote->set_content_url($content_url);
$aNewUserNote->set_content($content);
$aNewUserNote->set_right($right);
$aNewUserNote->set_status($status);

$aNewlyCreateNoteId = 0; 

if(!$this->note_model->create_note_by_note($aNewUserNote, $aNewlyCreateNoteId))
{          
    //create success
    return;
}   

//get back the object from the model
$aNewlyCreateObj = $this->note_model->read_note_by_note_id($aNewlyCreateNoteId);


$aTagNameString = $this->input->post('ui_tag');
$tagsStringArray = $this->convert_tags_string_to_lower_case_string_array($aTagNameString);

$aTagArray = array();  
$createNewTagIsSuccess = FALSE;

//Create New Tag
for($i = 0; $i < count($tagsStringArray); $i++)
{   
    $aTagObj = $this->tag_model->read_tag_by_tag_name($tagsStringArray[$i]);
    if($aTagObj == NULL)
    {
        $aNewTag =new obj_tag();
        $aNewTag->set_create_user_id($user_id);
        $aNewTag->set_tag_name($tagsStringArray[$i]);

        if(!$this->tag_model->create_tag_by_tag($aNewTag)) //create tag fail
        {
          $createNewTagIsSuccess = FALSE;  
        }
    }
}  

//Read all the tag
for($j = 0; $j < count($tagsStringArray); $j++)
{ 
    $aTagObj = $this->tag_model->read_tag_by_tag_name($tagsStringArray[$j]);
    $aTagArray[count($aTagArray)] = $aTagObj;
}                                            


//Make the note, and tag have relationship
for($k = 0; $k < count($aTagArray); $k++)
{                                       
    $theTagObj = $aTagArray[$k];          


    $aNoteTagList = new obj_note_tag_list();
    $aNoteTagList->set_note_id($aNewlyCreateObj[0]->get_id());
    $aNoteTagList->set_tag_id($theTagObj[0]->get_id());

    $this->note_tag_list_model->create_note_tag_list_by_note_tag_list($aNoteTagList);
}


326
2
задан 22 августа 2011 в 11:08 Источник Поделиться
Комментарии
3 ответа

Вы могли бы написать конструктор для вашего объекта:

//create a note object
$aNewUserNote =new obj_note(get_current_user_id(),
$this->input->post('ui_title_input'),
$this->input->post('ui_url_input'),
$this->input->post('ui_textarea'),
STATUS_NOTE_ACTIVE
);

То же самое для тега:

    $aNewTag =new obj_tag($user_id, $tagsStringArray[$i]);

1
ответ дан 22 августа 2011 в 01:08 Источник Поделиться

Это:

//set the object information
$user_id =get_current_user_id();
$title =$this->input->post('ui_title_input');
$content_url =$this->input->post('ui_url_input');
$content =$this->input->post('ui_textarea');
$right =RIGHT_NOTE_PUBLIC;
$status =STATUS_NOTE_ACTIVE;

$aNewUserNote->set_user_id($user_id);
$aNewUserNote->set_title($title);
$aNewUserNote->set_content_url($content_url);
$aNewUserNote->set_content($content);
$aNewUserNote->set_right($right);
$aNewUserNote->set_status($status);

Следует переписать как этот

// create and populate note object
$note = new obj_note();
$note->set_user_id(get_current_user_id());
$note->set_title($this->input->post('ui_title_input'));
$note->set_content_url($this->input->post('ui_url_input'));
$note->set_content($this->input->post('ui_textarea'));
$note->set_right(RIGHT_NOTE_PUBLIC);
$note->set_status(STATUS_NOTE_ACTIVE);

Кроме этого, мой комментарий на ваш вопрос будет объяснить остальное.

0
ответ дан 22 августа 2011 в 12:08 Источник Поделиться

Просто некоторые идеи по улучшению код немного:

1, я бы не стал рассчитывать размер массива в каждой итерации. Так что я бы изменить

for($i = 0; $i < count($tagsStringArray); $i++) { ... }

для

$size = count($tagsStringArray)
for ($i = 0; $i < $size; $i++) { ... }

2, использовать защитные предложения:

//Create New Tag
for($i = 0; $i < count($tagsStringArray); $i++)
{
$aTagObj = $this->tag_model->read_tag_by_tag_name($tagsStringArray[$i]);
if($aTagObj != NULL) {
continue;
}

$aNewTag = new obj_tag();
$aNewTag->set_create_user_id($user_id);
$aNewTag->set_tag_name($tagsStringArray[$i]);

if(!$this->tag_model->create_tag_by_tag($aNewTag)) //create tag fail
{
$createNewTagIsSuccess = FALSE;
}

}

3, следующие замечания могут быть имена функций:

//Create New Tag
//Read all the tag
//Make the note, and tag have relationship

Например:

function readAllTags($tagsStringArray) {
$aTagArray = array();
for($j = 0; $j < count($tagsStringArray); $j++)
{
$aTagObj = $this->tag_model->read_tag_by_tag_name($tagsStringArray[$j]);
$aTagArray[count($aTagArray)] = $aTagObj;
}
return $aTagArray;
}

Это делает код сглаживаются и легче читать: http://www.codinghorror.com/blog/2006/01/flattening-arrow-code.html

4, использовать значение $createNewTagIsSuccess или опустить переменной. Код установите в ложных , прежде чем создать новый тег петли и петли иногда установить его в значение false снова. Это выглядит немного странно. (Может, ошибка? Код не использует этот флаг.)

$createNewTagIsSuccess = FALSE;

5, я согласен с @Локи изящные о конструкторах. Кроме того, рассмотрим статические методы фабрики вместо конструкторов (см. Мартин Фаулер: эффективная Java второе издание, пункт 1.)

6, насколько мне известно, показатель в следующем ненужно:

$aTagArray[count($aTagArray)] = $aTagObj;

Так что используйте

$aTagArray[] = $aTagObj;

0
ответ дан 20 ноября 2011 в 09:11 Источник Поделиться