CODEIGNITER:检查成分是不是存在
Posted
技术标签:
【中文标题】CODEIGNITER:检查成分是不是存在【英文标题】:CODEIGNITER: check if ingredient existCODEIGNITER:检查成分是否存在 【发布时间】:2016-02-09 07:59:03 【问题描述】:我有表成分 w/c 由 (ingredient_id,name) 组成,类别 w/c 由 (category_id,name) 和 category_ingredients w/c 组成 (ingredient_id,category_id)。我创建了一个按类别添加许多成分的表格,我想检查是否已经存在一种或多种成分,然后我只需要获取成分的 id,然后将不存在的其他成分插入我的数据库中.你们能帮帮我吗?
这是我的代码: 查看:
<?php echo form_open('dashboard/uploadIngredients', 'class="form-horizontal" enctype="multipart/form-data"'); ?>
<div class="form-group">
<div class="col-sm-10">
<select required class="form-control" name="ingredient_category">
<option value="" selected disabled>Select Ingredient Category</option>
<option value="All">All</option>
<?php foreach($this->products_model->getCategory() as $row): ?>
<option value="<?php echo $row->category_id ?>"><?php echo $row->category_name; ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="form-group">
<div class="col-sm-10">
<textarea class="form-control" name="ingredients" rows="5" placeholder="Ingredients (EX. onion, oil, pasta)" required></textarea>
</div>
</div>
<div class='form-group'>
<div class="col-sm-10">
<button class="btn btn-lg btn-positive" type="submit"><i class="glyphicon glyphicon-ok"></i> Save Ingredient</button>
</div>
</div>
<?php echo form_close(); ?>
控制器:
public function uploadIngredients()
foreach(explode(',', $this->input->post('ingredients')) as $key => $value)
$saveData[] = array('ingredient_id' => null,
'name' => trim($value)
);
$ingredient_id = $this->products_model->saveIngredients($saveData);
foreach (explode(',', $this->input->post('ingredient_category')) as $key => $value)
foreach ( $ingredient_id as $key => $str )
$joinData[] = array(
'ingredient_id' => $str,
'category_id' => intval($value)
);
//var_dump($joinData); die();
$this->products_model->saveCategoryIngredients($joinData);
redirect('dashboard/add_ingredients');
型号:
public function saveIngredients($ingredient_id)
foreach($ingredient_id as $row => $value)
$query=$this->db->where('ingredient_id', $value->ingredient_id);
$this->db->insert('ingredient', $value);
$insert_id[] = $this->db->insert_id();
return $insert_id;
public function saveCategoryIngredients($data)
foreach($data as $row => $value)
$this->db->insert('category_ingredient', $value);
$insert_id[] = $this->db->insert_id();
return $insert_id;
【问题讨论】:
【参考方案1】:您只需向模型添加一个函数,如下所示:
<?php
public function getIngredientByName($name)
return $this->db
->from('ingredient I')
->where('I.name', $name)
->get()->row(); //Will return the row of ingredient if ingredient exists, else null
在你的控制器中:
<?php
foreach(explode(',', $this->input->post('ingredients')) as $key => $value)
if (!$this->products_model->getIngredientByName($value))
$saveData[] = array(
'ingredient_id' => null,
'name' => trim($value)
);
【讨论】:
我建议使用 where("( REPLACE( LOWER(I.name
), ' ', '') LIKE '".strtolower(preg_replace('/\s+/', ' ', $name)) ."%')") 代替 where('I.name', $name) 以避免 sUgar Cane 之间的 mysql 混淆b> 和 甘蔗 并避免不必要的插入...快乐编码:)
@PraveenKumar 嗯,我不知道...通常,我更喜欢在控制器中执行此操作,最佳做法是什么?
也谢谢你@PraveenKumar!先生,这将有很大帮助:)
我建议你的那个是我认为的最佳实践。但是最好询问其他专家是否也可以使用 abdulla 或 devpro :) :) @Gwendal【参考方案2】:
感谢 Gwendal 回答这个问题,我正在修改这个答案以防止重复插入,例如:- 如果用户插入 SuGar CaNe 但我们的数据库中有 Sugar Cane然后带有答案的代码,我们将有 2 个 甘蔗 以避免这些类型的插入,我们可以将此代码用于模型
<?php
public function getIngredientByName($name)
return $this->db
->from('ingredient I')
-> where("( REPLACE( LOWER(I.name), ' ', '') LIKE '".strtolower(preg_replace('/\s+/', '', $name)) ."%')")
->get()->row(); //Will return the row of ingredient if ingredient exists, else null
与控制器相同
<?php
foreach(explode(',', $this->input->post('ingredients')) as $key => $value)
if (!$this->products_model->getIngredientByName($value))
$saveData[] = array(
'ingredient_id' => null,
'name' => trim($value)
);
【讨论】:
以上是关于CODEIGNITER:检查成分是不是存在的主要内容,如果未能解决你的问题,请参考以下文章