2013-03-28 12 views
5

Jak mogę zwrócić wszystkie identyfikatory po insert_bunch? Funkcja:Codeigniter 2.1 - identyfikatory zwrotne po dodaniu wsadu

public function insert_slike($id, $slike, $folder, $polje, $tabela) 
{ 
     $slike = explode(',', $slike); 
     $i = 1; 
     $data = array(); 
     foreach ($slike as $slk) { 
      $this->img_upload_resize($slk, $folder); 
      $data[] = array(
       $polje => $id, 
       'path' => $slk 
       ); 
      $i++; 
     } 

     $this->db->insert_batch($tabela, $data); 
} 
+0

co się stanie, jeśli ktoś uruchomi pojedynczą wkładkę wraz z wsadem wsadowym? dostaniesz odpowiednie ID? na przykład partia jest uruchomiona i id z tabeli wygląda jak - 1,2,3,4, pojedyncza wstawka tutaj, 6. Czy powróci - 1,2,3,4,6 lub 1,2,3,4,5,6 na wsadkę wsadową? nawiązując do odpowiedzi Alestera, może wiesz, że to jest –

Odpowiedz

2

ten temat w odniesieniu do MySQL zostało wcześniej omówione:

How can I Insert many rows into a MySQL table and return the new IDs?

W CodeIgniter, używając $this->db->insert_id() powróci tylko identyfikator pierwszej wkładki.

Gdybym to robił, otwierałbym transakcję i robiłbym wstawki po jednym na raz, przechowując identyfikator po każdej wstawce.

+0

To lepsze niż inne. –

+3

Jak jest lepiej? Indywidualne wstawki to śmiesznie nieefektywna i powolna metoda. – Stonestorm

-2

Zgadzam się z Markiem. CI insert_batch jest po prostu użyć foreach, aby zrobić każdą wstawkę, więc jeśli używasz transakcji, aby to zrobić. Otrzymasz ten sam efekt lub lepszy efekt, a także możesz uzyskać wszystkie insert_id po wstawieniu.

+2

CI insert_batch to nie to samo co foreach dla pojedynczej wkładki. insert_batch użyje tylko jednego zapytania do wstawienia wielu elementów. – MRodrigues

+1

CI insert_batch() to * NIE * foreach - Następnym razem, gdy użyjesz metody insert_batch(), spróbuj wywołać last_query(), a zobaczysz, – Stonestorm

0

1. Utwórz własny identyfikator zamiast wygenerowanych automatycznie.

2.Włóż z identyfikatorem zostały genereated

3.Have tablicy wstawionego ID

4.Return tablica zapisany identyfikator

9

Oto skuteczna metoda:

Ponieważ twoje rekordy mają identyfikatory rezultatów, zakładam, że również automatycznie się zwiększają.

W takim przypadku robisz to i nadal używasz insert_batch.

Oto co trzeba zrobić:

1. Bierzesz liczbę elementów wstawiasz:

$count = count($data); 

2. Uruchom wkładkę wsadowy:

$this->db->insert_batch($table, $data); 

. Zdobyć pierwszy wstawiony identyfikator swojej partii:

$first_id = $this->db->insert_id(); 

4. Dodaj licznik (minus 1) do swojego identyfikatora wkładki dostać ostatnią rekordy identyfikator.

$last_id = $first_id + ($count-1); 

Proszę! Masz teraz swoje pierwsze i ostatnie identyfikatory swoich wstawionych rekordów, a przez to wszystko inne.

Uwaga:

Kilka osób pytało, co może się zdarzyć, jeśli dwie wkładki wsadowe zdarzyć jednocześnie; InnoDB inteligentnie zarządza identyfikatorami nowych wierszy, aby zapobiec przecinaniu się danych, dzięki czemu ta metoda jest ważna.

+0

Bardzo inteligentne obejście, proste i czyste. Dzięki! – Charas

+0

Co się dzieje, jeśli są 2 zapytania wstawiania w tym samym czasie? – machineaddict

+0

@machineaddict to, o czym myślę. Co się stanie, gdy 2 użytkowników wstawi dwa zapytania w tym samym czasie. Wsparcie? – user3631428

0

Funkcja insert_batch() zwraca tylko pierwszy identyfikator twojej partii. użyj funkcji insert() w pętli for, aby uzyskać wszystkie identyfikatory.

public function insert_slike($id, $slike, $folder, $polje, $tabela) 
{ 
    $slike = explode(',', $slike); 
    $data = array(); 
    $ids = array(); 
    foreach ($slike as $slk) { 
     $this->img_upload_resize($slk, $folder); 
     $data = array(
      $polje => $id, 
      'path' => $slk 
      ); 
     $this->db->insert($tabela, $data); 
     $ids[]=$this->db->insert_id(); 
    } 
} 
+1

Czy możesz rozwinąć tę odpowiedź, aby podać przykład użycia? –

+0

funkcja publiczna insert_slike ($ id, $, folder $, $ polje, $ tabela) { $ na przykład = eksplodować (",", $); $ data = array(); $ ids = array(); foreach ($ jak w $ slk) { $ this-> img_upload_resize ($ slk, $ folder); $ data = tablica ( $ polje => $ id, 'ścieżka' => $ slk ); $ this-> db-> insert ($ tabela, $ data); $ ids [] = $ this-> db-> insert_id(); } } –

Powiązane problemy