2015-03-28 8 views
16

Czy jest możliwe utworzenie zapytania active rekord w CodeIgniter, które zaktualizuje istniejący rekord, jeśli taki już istnieje, lub wstawi, jeśli nie, dla danego klucza?CodeIgniter- aktywna wstawka rekordu, jeśli nowa lub aktualizacja duplikatu

Rozumiem, że można to zrobić przez pierwsze zapytanie, aby znaleźć istniejący rekord, ale szukam najbardziej efektywnego podejścia.

+0

jeśli element ma identyfikator lub gdy nie przedstawiła – charlietfl

Odpowiedz

3

ja nie wiem CodeIgniter Aktywny Klasa Record ma tę metodę, czy nie sprawdzić codeigniter docs dla metod zawierających w aktywnej klasy rekord

Ale można achive to throug rozszerzenie modeli rdzeniu codeigniter. Za pomocą tej metody można użyć tej metody dla wszystkich modeli, które rozszerzają tę klasę modelu. Wystarczy umieścić MY_model.php w aplikacji/core/i wpisać następujący kod.

Class MY_Model extends CI_Model 
{ 
    public function insert_update($data) 
    { 
     // code for checking existing record. 
     if(//existing record) 
      fire the update query 
     else 
      fire the insert query 

     return insert/update id; 

    } 
} 

po utworzeniu powyższy plik trzeba zmienić wszystkie swoje modele klasy nadrzędnej do nowego Rozszerzony modelu tj MY_Model

class some_model extends MY_Model 

UWAGA: Musisz wybrać klucz podstawowy z wyników i umieść go w miejscu, w którym jest.

Jest to bardzo ważne, więc to, co robię, gdy otrzymam dane z kontrolera, po prostu sprawdzam, czy mam identyfikator, czy nie, jeśli Id jest obecny, to wystrzeliłem zapytanie o aktualizację, jeśli nie, wtedy wystrzeliłem Wstaw Zapytanie.

powodzenia

+1

OP już zna tę metodę. Chce poznać każdą dostępną, skuteczną drogę. –

24

Zasadniczo co szukasz może być to INSERT ... ON DUPLICATE KEY UPDATE - pod warunkiem, że używasz MySQL a id to unikatowy klucz na stole.

Trzeba ręcznie skonstruować zapytanie i przejść do funkcji $this->db->query() zamiast jakiegokolwiek wbudowanego aktywnego rekordu, takiego jak funkcje pomocnicze sterownika DB.

Przykład:

$sql = 'INSERT INTO menu_sub (id, name, desc, misc) 
     VALUES (?, ?, ?, ?) 
     ON DUPLICATE KEY UPDATE 
      name=VALUES(name), 
      desc=VALUES(desc), 
      misc=VALUES(misc)'; 

$query = $this->db->query($sql, array($id, 
             $this->validation->name, 
             $this->validation->desc, 
             $this->validation->misc 
            )); 
+1

Tak, to jedyny sposób. –

+1

Dobra odpowiedź i +1 do pytania OP - szukałem tego sam. – snh

1

Używam tego podejścia:

  1. configure tabela mytable z unique id i unique kluczu column xyz, który chcesz zaktualizować

  2. spróbuj wstawić tablicęużywając INSERT IGNORE INTO unikają duplikaty

    $insert_query = $this->db->insert_string('bt_ical_list', $data); 
    $insert_query = str_replace('INSERT INTO','INSERT IGNORE INTO',$insert_query); 
    $this->db->query($insert_query); 
    

    ten wstawia wiersz, jeśli wartość column xyz nie istnieje

  3. funkcja zastosowanie insert_id() do zwracania id jeżeli rząd został wstawiony aktualizacji, jeżeli nie został wprowadzony rząd .

    if(!$this->db->insert_id()){ 
        $query=$this->db ->where('xyz', $data['xyz']) 
             ->update('my_table',$data); 
    }; 
    
3

można to zrobić prościej:

$sql = $this->db->insert_string(table, $array) . ' ON DUPLICATE KEY UPDATE ' . 
implode(', ', $array); 
$this->db->query($sql); 
12

Jeśli używasz CodeIgniter 3.0 lub wyższej, możesz rozważyć użycie "$ this-> db-> replace()". Zgodnie z instrukcją:

"Ta metoda wykonuje instrukcję REPLACE, która jest w zasadzie standardem SQL dla (opcjonalnie) DELETE + INSERT, przy użyciu kluczy PRIMARY i UNIQUE jako decydującego czynnika. W naszym przypadku to pozwoli Ci zaoszczędzić od potrzeby implementacji złożonych logik z różnymi kombinacjami wywołań select(), update(), delete() i insert(). "

Innymi słowy,

  • Jeśli nie istnieje, to wstawia nowy rekord.
  • Jeśli istnieje, aktualizuje go zgodnie z kluczem podstawowym lub unikalnym.

Wystarczy użyć go prosto z pudełka jak:

$data = array(
     'title' => 'My title', 
     'name' => 'My Name', 
     'date' => 'My date' 
); 

$this->db->replace('table', $data); 

nie akumulatory wymagane !!!

+0

prawdziwe codeigniter odpowiedź –

+0

ale to ma problem z aktualizacją, gdy mają auto id inkrementacji, zwiększa się, gdy replce –

+0

@ SameeraPrasadJayasinghe _ "... REPLACE INTO usuwa zasadniczo wiersz, jeśli istnieje i wstawia nowy wiersz ..." _ - z komentarza Dale'a na odpowiedź tutaj: https://stackoverflow.com/a/4205222/1475817 –

0

Oto metoda, która mam nadzieję, że można osiągnąć ten sam czek

/** 
    * Used to insert new row if a duplicate entry is encounter it performs an update 
    * @param string $table table name as string 
    * @param array $data associative array of data and columns 
    * @return mixed 
    */ 
    private function updateOnExist($table, $data) 
    { 
     $columns = array(); 
     $values  = array(); 
     $upd_values = array(); 
     foreach ($data as $key => $val) { 
      $columns[] = $this->db->escape_identifiers($key); 
      $val = $this->db->escape($val); 
      $values[]  = $val; 
      $upd_values[] = $key.'='.$val; 
     } 
     $sql = "INSERT INTO ". $this->db->dbprefix($table) ."(".implode(",", $columns).")values(".implode(', ', $values).")ON DUPLICATE KEY UPDATE".implode(",", $upd_values); 
     return $this->db->query($sql); 
} 
Powiązane problemy