2010-07-29 11 views
16

मेरे पास कोडइग्निटर/PHP मॉडल है और मैं डेटाबेस में कुछ डेटा डालना चाहता हूं।मैं अपने कोडइग्निटर मॉडल में डिप्लिकेट कुंजी अपडेट पर कैसे उपयोग करूं?

हालांकि, मैं अपने 'कच्चे' SQL क्वेरी में इस सेट है:

ON DUPLICATE KEY UPDATE duplicate=duplicate+1 

मैं CodeIgniter उपयोग कर रहा हूँ और करने के लिए अपने सभी पिछले में नियंत्रक एसक्यूएल प्रश्नों परिवर्तित कर रहा हूँ ActiveRecord। ActiveRecord- आधारित मॉडल के भीतर से ऐसा करने का कोई तरीका है?

धन्यवाद!

जैक

उत्तर

2

ऊपर दिए गए फ़ोरम थ्रेड का लिंक टूटा हुआ है। मुझे कॉल के लिए डीबी-> क्वेरी का उपयोग करने से बेहतर तरीके से पता नहीं है, अगर किसी के पास बेहतर समाधान है, तो कृपया इसे पोस्ट करें।

$result = $this->CI->db->query(
    "INSERT INTO tablename (id, name, duplicate) VALUES (1, 'Joe', 1) ". 
    "ON DUPLICATE KEY UPDATE duplicate=duplicate+1"); 

मुझे आशा है कि इससे किसी को इसका समाधान ढूंढने में मदद मिलेगी।

4

आप कम से कम इसके साथ सक्रिय रिकॉर्ड समारोह tweak कर सकते हैं:

DB_driver.php वर्ग के अंदर जोड़ें:

protected $OnlyReturnQuery = false; 
public function onlyReturnQuery($return = true) 
{ 
    $this->OnlyReturnQuery = $return; 
} 

खोज समारोह क्वेरी (... और बहुत शुरुआत में जोड़ें:

if ($this->OnlyReturnQuery) { 
     $this->OnlyReturnQuery = false; 
     return $sql; 
    } 

और अंत में DB_active_rec.php में जोड़ने के कार्य:

public function insert_or_update($table='', $data=array()) 
{ 
    $this->onlyReturnQuery(); 
    $this->set($data); 
    $insert = $this->insert($table); 
    $this->onlyReturnQuery(); 
    $this->set($data); 
    $update = $this->update($table); 
    $update = preg_replace('/UPDATE.*?SET/',' ON DUPLICATE KEY UPDATE',$update); 
    return $this->query($insert.$update); 
} 

अब आप इसे इस प्रकार उपयोग कर सकते हैं:

$ यह-> डीबी-> insert_or_update ('table', array $ data);

सकारात्मक: सभी सक्रिय रिकॉर्ड सत्यापन विपक्ष का उपयोग करता है: यह सबसे अच्छा (सबसे उचित) समारोह का विस्तार, यदि आप इन फ़ाइलों को अद्यतन करने के लिए योजना बना रहे हैं, तो आप प्रक्रिया को फिर से करना होगा क्योंकि के रास्ते नहीं है ।

43

आप किसी भी कोर फाइल को संशोधित किए बिना "ऑन डिप्लिकेट" कथन जोड़ सकते हैं।

$sql = $this->db->insert_string('table', $data) . ' ON DUPLICATE KEY UPDATE duplicate=LAST_INSERT_ID(duplicate)'; 
$this->db->query($sql); 
$id = $this->db->insert_id(); 

मुझे उम्मीद है कि यह किसी की मदद करेगा।

1) यह अद्यतन नई क्वेरी बिल्डर का उपयोग करना (सीआई 3), पूर्व में सक्रिय रिकॉर्ड के रूप में जाना जाता है:

+0

हाँ यह मदद मिली :) – Nishant

+0

यह सबसे साफ समाधान है जब तक सीआई इसे जोड़ता नहीं है। ओ/ – Nemke

+0

वोट दें जो संदिग्ध है क्योंकि वे समर्थन छोड़ते हैं :(http://ellislab.com/blog/entry/ellislab-seeking-new-owner-for-codeigniter – Shaffe

0

टुकड़ा पिकेट से जुड़े हुए के बाद, मैं करने के लिए कुछ सुधार किए हैं।

2) अब आप एक सहयोगी सरणी (कुंजी => मान) या सहयोगी सरणी की एक सरणी पास कर सकते हैं। दूसरे रूप में, यह एक बहु अद्यतन करता है।

मैंने केवल इसे mysqli के साथ परीक्षण किया, और यह अच्छी तरह से काम करता है।

कोड का यह टुकड़ा सिस्टम/डेटाबेस/ड्राइवर/mysqli/mysqli_driver में जाता है।php

function _duplicate_insert($table, $values) 
{ 
    $updatestr = array(); 
    $keystr = array(); 
    $valstr = array(); 

    foreach($values as $key => $val) 
    { 
     $updatestr[] = $key." = ".$val; 
     $keystr[] = $key; 
     $valstr[] = $val; 
    } 

    $sql = "INSERT INTO ".$table." (".implode(', ',$keystr).") "; 
    $sql .= "VALUES (".implode(', ',$valstr).") "; 
    $sql .= "ON DUPLICATE KEY UPDATE ".implode(', ',$updatestr); 

    return $sql; 
} 

function _multi_duplicate_insert($table, $values) 
{ 
    $updatestr = array(); 
    $keystr = array(); 
    $valstr = null; 
    $entries = array(); 

    $temp = array_keys($values); 
    $first = $values[$temp[0]]; 

    foreach($first as $key => $val) 
    { 
     $updatestr[] = $key." = VALUES(".$key.")"; 
     $keystr[] = $key; 
    } 

    foreach($values as $entry) 
    { 
     $valstr = array(); 
     foreach($entry as $key => $val) 
     { 
      $valstr[] = $val; 
     } 
     $entries[] = '('.implode(', ', $valstr).')'; 
    } 

    $sql = "INSERT INTO ".$table." (".implode(', ',$keystr).") "; 

    $sql .= "VALUES ".implode(', ',$entries); 
    $sql .= "ON DUPLICATE KEY UPDATE ".implode(', ',$updatestr); 

    return $sql; 
} 

और यह /system/database/DB_query_builder.php फ़ाइल में चला जाता है:

function on_duplicate($table = '', $set = NULL) 
{ 
    if (! is_null($set)) 
    { 
     $this->set($set); 
    } 

    if (count($this->qb_set) == 0) 
    { 
     if ($this->db_debug) 
     { 
      return $this->display_error('db_must_use_set'); 
     } 
     return FALSE; 
    } 

    if ($table == '') 
    { 
     if (! isset($this->qb_from[0])) 
     { 
      if ($this->db_debug) 
      { 
       return $this->display_error('db_must_set_table'); 
      } 
      return FALSE; 
     } 

     $table = $this->qb_from[0]; 
    } 

    $is_multi = false; 
    foreach (array_keys($set) as $k => $v) { 
     if ($k === $v) { 
      $is_multi = true; //is not assoc 
      break; 
     } 
    } 

    if($is_multi) 
    { 
     $sql = $this->_multi_duplicate_insert($this->protect_identifiers($table, TRUE, NULL, FALSE), $this->qb_set); 
    } 
    else 
    { 
     $sql = $this->_duplicate_insert($this->protect_identifiers($table, TRUE, NULL, FALSE), $this->qb_set); 
    } 

    $this->_reset_write(); 
    return $this->query($sql); 
} 

तो फिर तुम एक ही पंक्ति सम्मिलित/अपडेट करने के लिए ऐसा कर सकते हैं:

$this->db->on_duplicate('table', array('column1' => 'value', 'column2' => 'value')); 

या यह एक बहु डालने/अद्यतन के लिए:

$this->db->on_duplicate('table', array(
    array('column1' => 'value', 'column2' => 'value'), 
    array('column1' => 'value', 'column2' => 'value') 
)); 
3

Codeigniter 3.0.6

public function updateOnDuplicate($table, $data) { 
    if (empty($table) || empty($data)) return false; 
    $duplicate_data = array(); 
    foreach($data AS $key => $value) { 
     $duplicate_data[] = sprintf("%s='%s'", $key, $value); 
    } 

    $sql = sprintf("%s ON DUPLICATE KEY UPDATE %s", $this->db->insert_string($table, $data), implode(',', $duplicate_data)); 
    $this->db->query($sql); 
    return $this->db->insert_id(); 
} 
2

नीचे में मेरे लिए नीचे प्रक्रिया का काम एक कोड का टुकड़ा है मैं डुप्लिकेट पर अद्यतन के लिए हर का उपयोग करें:

$sql = "insert into table_name (id, name) values(".$id.",'".$name."') on duplicate key update id=".$id.",name='".$name."'"; 
//Executing queries 
$result = $this->db->query($sql, array($id, $name)); 

नोट: स्तंभ id प्राथमिक या अद्वितीय होना चाहिए

0

$this->db->query() और पैरामीटर का उपयोग करके, मैं यह कैसे करता हूं। पहले 4 पैरामीटर सम्मिलित भाग के लिए हैं और अंतिम तीन पैरामीटर on duplicate key update भाग के लिए दोहराए जाते हैं।

$sql = "insert into application_committee ". 
     "(application_id, member1_id, member2_id, member3_id) values (?, ?, ?, ?)". 
     " on duplicate key update member1_id = ?, member2_id = ?, member3_id = ?"; 

$this->db->query($sql, array($appid, $member_1, $member_2, $member_3, 
       $member_1, $member_2, $member_3); 
संबंधित मुद्दे