[英]How to check for Array in Database CodeIgniter and if they don't exist Add them
So I just want to insert the data if the typed data does not exist and/or remove them if users decides to remove them; 因此,我只想在键入的数据不存在的情况下插入数据,和/或在用户决定删除它们的情况下将其删除; the problem is that it checks for more > 1 value.
问题在于它检查的值是否大于1 。
This should be my last question of three in total(see my last two question on profile) regarding the same topic, relationships. 这应该是我关于相同主题,关系的总共三个问题(请参阅我的最后两个问题)。
So I have three tables like the ones given below: 所以我有三个表,如下所示:
AI = auto increment. AI =自动递增。
ci_users: user_id(AI), username, slug, email, biography. ci_users: user_id(AI),用户名,slug,电子邮件,传记。
ci_terms: term_id(AI), title, slug, body. ci_terms: term_id(AI),标题,子词,正文。
ci_relationship: id(AI), term_id, user_id, type. ci_relationship: id(AI),term_id,user_id,类型。
I'm actually trying to do this in a edit view in which I get all the terms from ci_terms and and the already(added directly in databse) ci_terms attached to the user with the following controller: 我实际上正在尝试在编辑视图中执行此操作,在该视图中,我从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');
}
}
Here is how I get to display the attached(to user) terms from the ci_terms table into the view: 这是我如何将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;
}
}
This is the method which I'm still trying to create that checks for all the selected terms before adding them if they don't exist: 这是我仍在尝试创建的方法,该方法会在所有选定的术语不存在之前对其进行检查:
// 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();
}
to continue, here is the function which is supposed(not tested) to delete them if they're unselected from the input: 要继续,这里是假定(未经测试)如果未从输入中将其删除则将其删除的功能:
// 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);
}
Finally here is the view in which I'm using a dropdown with select2: 最后,这是我在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>
BELOW ARE JUST IMAGES 以下只是图像
So what I'm trying to achieve is this: 所以我想要实现的是:
As you can see there HTML5(term_id, 1) and CSS(term_id, 2) are the attached term_id's and if I deselect them, they should be deleted from ci_relationship after clicking the update button and the same(not really) goes when selecting new terms that are not attached, they should be added. 如您所见,HTML5(term_id,1)和CSS(term_id,2)是附加的term_id,如果我取消选择它们,则应在单击“更新”按钮后将它们从ci_relationship中删除,并且在选择new时它们(实际上不是)未附加的条款,应添加。
Is pretty much a relationship system like the one WordPress uses. 就像一个WordPress使用的关系系统。
Thanks in advance. 提前致谢。
I guess you are overthinking here to much - you should just delete all items related to that user and after that insert the new ones which are selected... 我想您在这里想的太多了-您应该删除与该用户相关的所有项目,然后在其中插入被选中的新项目...
an example for your model function could be 您的模型函数的示例可能是
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;
}
and the part in your controller could look like 控制器中的零件可能看起来像
$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[]'));
of course you can also add a rule, in case if term_id
is required 当然,如果还需要
term_id
,您也可以添加一条规则
$this->form_validation->set_rules('term_id[]', 'Term', 'trim|required');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.