更新一行,但如果在codeigniter中不存在行,则插入

时间:2014-06-05 00:11:53

标签: php mysql codeigniter

我想在表格中插入一行,如下所示:

$this->db->update_batch($this->table_name, $update, 'image_id');

if ($this->db->affected_rows() === 0) {
    $this->db->insert_batch($this->table_name, $update);
}

但如果它存在我不想做任何事情。但是上面的代码插入了另一行,因为没有行受影响

我想我可以做 INSERT IGNORE INTO ,但我更喜欢使用CodeIgniters upate_batch insert_batch

$update - 变量类似于

$update = array(
   array('id' => 1, 'name' => 'Gustav'),
   array('id' => 2, 'name' => 'Peter'),
   array('id' => 3, 'name' => 'Lisa')
)

更新

根据答案,我得到的是我对自己想要的东西不够清楚。 (我并不认为我已经足够清楚我想要的了,所以这里是我更新的问题,希望更清楚)

//This will insert Gustav, Peter and Lisa

$update = array(
   array('image_id' => 1, 'name' => 'Gustav'),
   array('image_id' => 2, 'name' => 'Peter'),
   array('image_id' => 3, 'name' => 'Lisa')
)
$this->db->insert_batch($update);


//If I do this it would insert Party Gustav, Peter and Lisa.
$update = array(
   array('image_id' => 1, 'name' => 'Party Gustav'),
   array('image_id' => 2, 'name' => 'Peter'),
   array('image_id' => 3, 'name' => 'Lisa')
)
$this->db->insert_batch($update);

//Above will create 6 rows

但我想要发生的是

$update = array(
   array('image_id' => 1, 'name' => 'Gustav'),
   array('image_id' => 2, 'name' => 'Peter'),
   array('image_id' => 3, 'name' => 'Lisa')
)
$this->db->insert_batch($update);

$update = array(
   array('image_id' => 1, 'name' => 'Party Gustav'),
   array('image_id' => 2, 'name' => 'Peter'),
   array('image_id' => 3, 'name' => 'Lisa')
)


//Insert batch but when existing image_ids just change the name 
//from Gustav to Party Gustav (in this case)
$this->db->insert_batch($update); 

//Above will create 3 rows

我猜它会等同于on key duplicate的{​​{1}}。

3 个答案:

答案 0 :(得分:2)

我认为您正在寻找的是INSERT IGNORE INTO。不幸的是,Codeigniter没有等效的Active Record功能。 discussion on the Codeigniter forums和此similar SO question建议使用以下方法:

foreach ($update as $update_item) {
    $insert_query = $this->db->insert_string($this->table_name, $update_data['name']);
    $insert_query = str_replace('INSERT INTO','INSERT IGNORE INTO',$insert_query);
    $this->db->query($insert_query);  
}

另请注意image_id must be UNIQUE

答案 1 :(得分:2)

首先从表中选择所有image_id。

$data = $this->db->select(`image_id`)->get($this->table_name)->result_array();

将image_id列入数组。

$image_ids=array();

foreach($data as $key => $value):

$image_ids[$key]=$value[`image_id`];

endforeach;

$update = array(
   array('image_id' => 1, 'name' => 'Party Gustav'),
   array('image_id' => 2, 'name' => 'Peter'),
   array('image_id' => 3, 'name' => 'Lisa')
)

检查image_ids是否存在:

$update_query= $this->db->where_in(`image_ids`,$image_ids)
               ->get($this->table_name)->result();

if($update_query->num_rows() > 0):

  $this->db->update_batch($update,$this->table_name);//update if ids exist
else
   $this->db->insert_batch($update,$this->table_name);//insert if does not exist
endif;

答案 2 :(得分:0)

我已经使用了codeigniter已经有一段时间了,但你能检查一下该行是否存在,然后更新或插入?