Как проверить массив в базе данных CodeIgniter и если они не существуют Добавить их

Поэтому я просто хочу вставить данные, если типизированные данные не существуют, и / или удалить их, если пользователи решат их удалить; проблема в том, что он проверяет больше > 1 значение.

Это должен быть мой последний вопрос из трех (см. Мои последние два вопроса в профиле) по той же теме, отношения.

Итак, у меня есть три таблицы, подобные приведенным ниже:

AI = автоинкремент.

ci_users: user_id (AI), имя пользователя, слаг, электронная почта, биография.

ci_terms: term_id (AI), название, слизняк, тело.

ci_relationship: id (AI), term_id, user_id, тип.

Я на самом деле пытаюсь сделать это в режиме редактирования, в котором я получаю все термины из ci_terms и уже (добавлено непосредственно в databse) ci_terms, прикрепленных к пользователю со следующим контроллером:

public function edit($id){

// Verify user ID before updating/editing info
if($this->session->userdata('user_id') != $id) {
// Redirect to dashboard
redirect('users/dashboard');
}

// Field Rules
$this->form_validation->set_rules('email', 'Email', 'trim|required|min_length[7]|valid_email');

if ($this->form_validation->run() == FALSE) {

// Get user
$data['item'] = $this->User_model->get($id);

// Meta
$data['title']  = $this->settings->title.' | Edit '. ucfirst($data['item']->username);

// Get attached skills
$skills = array();
$skills[0] = 'Select Skills';

$skills_attached = $this->User_model->the_skills($id);

foreach($skills_attached as $skill){
$skills[$skill->term_id] = $skill->term_id;
}

$data['skills'] = $skills;

// Select Skills
$skill_options = array();
$skill_options[0] = 'Select Skills';

$skill_list = $this->Terms_model->get_list();

foreach($skill_list as $cat){
$skill_options[$cat->term_id] = $cat->title;
}

$data['skill_options'] = $skill_options;

//Load View Into Template
$this->template->load('public', 'default', 'users/edit', $data);

} else {

// Create User Data Array
$data = array(
'email'      => strip_tags($this->input->post('email')),
'biography'  => strip_tags($this->input->post('biography')),
);

// Update User
$this->User_model->update($id, $data);

// BEGINNING OF HERE IS WHERE I NEED HELP

// Here I try to check the selected ci_terms(term_id) in the database
$existent_skill = $this->User_model->existent_skill($this->input->post('term_id'));

// If the selected ci_terms(term_id) already exists, display an error
if (!empty($existent_skill)) {

// Create Message
$this->session->set_flashdata('error', 'You already have that one or more of those selected skills');

// Redirect to pages
redirect('users/edit/'.$id.'/'.$id->username);

} else {

// Display the data from ci_terms table
$skills = $this->Terms_model->get_list();

// Expect data to be array
$data = array();

foreach ($skills as $skill){
$data[] = array(
// The main problem how do I add the correct IDs to the array?
'term_id'   => $skill->id,
'user_id'   => $this->session->userdata('user_id'),
'type'      =>  'skill',
);
}

// If terms selected, add them
$this->db->insert_batch('ci_relationship', $data);

// I'm also trying to figure out a way to remove the terms that are already attached to the user if he/she decides not to want those skill anymore, any suggestion will be taken into practice.
// else if terms unselected, remove them
$this->User_model->delete_skills($id, $terms_id, $data);

// END OF HERE IS WHERE I NEED HELP

}

// Create Message
$this->session->set_flashdata('success', "You're account has been updated");

// Redirect to profile
redirect('users/dashboard');
}
}

Вот как я могу отобразить вложенные (для пользователя) термины из таблицы ci_terms в представление:

public function the_skills($id){

$this->db->select('*');
$this->db->from($this->relationship);
$this->db->where('user_id', $id);
$this->db->where('type', 'skill');

$query = $this->db->get();

if($query->num_rows() >= 1){
return $query->result();
} else {
return false;
}
}

Это метод, который я все еще пытаюсь создать, который проверяет все выбранные термины перед их добавлением, если они не существуют:

// Verify if relationship already exists
public function existent_skill($term_id) {
$query = $this->db->get_where($this->relationship, array(
'user_id' => $this->session->userdata('user_id'),
'term_id' => $term_id,
'type' => 'skill',
));
return $query->row_array();
}

чтобы продолжить, вот функция, которая должна (не проверена) удалять их, если они не выбраны из входных данных:

// Delete un-selected skills
public function delete_skills($id, $terms_id, $data){
$this->db->from($this->relationship);
$this->db->where('user_id', $id);
$this->db->where_in('term_id', $terms_id);
$this->db->where('type', 'skill');

$this->db->delete($this->relationship, $data);
}

Наконец, вот представление, в котором я использую раскрывающийся список с select2:

<!-- Skills -->
<div class="form-group">
<?php echo form_label('Skills', 'skills'); ?>
<div class="input-group date"><div class="input-group-addon"><i class="fa fa-star" aria-hidden="true"></i></div>
<?php
$data = array(
'id'        => 'term_id[]',
'name'      => 'term_id[]',
);
$class = array(
'class'     =>  'form-control js-example-basic-multiple',
'multiple'  => TRUE,
);
?>
<!-- $data is to provide the dropdown with the id and name -->
<!-- $skill_options is to get the terms from ci_terms in case the user wants to add them as their skill -->
<!-- $skills is to get the current term_id attached to the user which were added in the db -->
<!-- $class is to give the class of js-example-basic-multiple to enable select2 -->
<?= form_dropdown($data, $skill_options, $skills, $class); ?>
<script type="text/javascript">
// Select2 Input
$(document).ready(function () {
$('.js-example-basic-multiple').select2({
tags: true,
tokenSeparators: [',', ' '],
allowClear: true,
selectOnClose: false,
selectOnBlur: false,
});
});
</script>
</div>
</div>

НИЖЕ ПРОСТО ИЗОБРАЖЕНИЯ

Итак, что я пытаюсь достичь, это:
ожидаемое значение

Как вы можете видеть, HTML5 (term_id, 1) и CSS (term_id, 2) являются прикрепленными term_id, и если я отменил выбор, они должны быть удалены из ci_relationship после нажатия кнопки обновления, и то же самое (не совсем) происходит при выборе новой Термины, которые не прилагаются, к ним следует добавить.

Это в значительной степени система отношений, подобная той, которую использует WordPress.

Заранее спасибо.

0

Решение

Я думаю, что вы слишком много обдумываете — вы должны просто удалить все элементы, связанные с этим пользователем, и после этого вставить новые, которые выбраны …

примером для вашей модели может быть

public function updateSkills(array $arrSkills)
{
//in case if the array is empty you can stop the process here
if (empty($arrSkills))  return false;

//kill all associated items
$this->db
->where('user_id', $this->session->userdata('user_id'))
->where('type', 'skill');
->delete('ci_relationship');

//insert all items
$arrInsertData = [];

foreach($arrSkills AS $strSkill)
{
$arrInsertData[] = [
'term_id' => $strSkill,
'user_id' => $this->session->userdata('user_id'),
'type' => 'skill'
]
}

$this->db->insert_batch('ci_relationship', $arrInsertData);

return true;
}

и часть в вашем контроллере может выглядеть

$data = array(
'email'      => strip_tags($this->input->post('email')),
'biography'  => strip_tags($this->input->post('biography')),
);

// Update User
$this->User_model->update($id, $data);

// BEGINNING OF HERE IS WHERE I NEED HELP
$blnSuccess = $this->User_model->updateSkills($this->input->post('term_id[]'));

конечно, вы также можете добавить правило, если term_id необходимо

$this->form_validation->set_rules('term_id[]', 'Term', 'trim|required');
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector