2013-12-12 9 views
9

Starałem się znaleźć sposób na zresetowanie wartości automatycznego przyrostu w Laravel 4, ale wygląda na to, że ta funkcjonalność nie jest na razie wbudowana w wersję 4. więc zrobiłem to w ten sposób:Jak zresetować automatyczne zwiększenie przy usuwaniu użytkowników laravel?

$user = User::find($user_id); 

       if ($user) { 
        if ($user->delete()){ 

        DB::statement('ALTER TABLE users AUTO_INCREMENT = '.(count(User::all())+1).';'); 

        echo json_encode('User Was Deleted Successfully..'); 
        } 
      } 

każdym razem mogę usunąć użytkownika z bazy ustawić wskaźnik automatycznego przyrostu liczby wszystkich użytkowników +1.

jeśli ktoś ma lepsze rozwiązanie poinformować mnie proszę ..

+5

Nigdy nie ma żadnej potrzeby, aby zmienić automatycznego przyrostu podczas usuwania rekordów. – SamV

+0

Cóż, gdy mam 15 użytkowników i usuwam ostatnie 5, nowy użytkownik otrzyma identyfikator 16, ale chcę zacząć od 10 – aimiliano

+0

. Dlaczego chcesz go uruchomić ponownie? Nie ma na to żadnej funkcjonalnej potrzeby.Jeśli naprawdę chcesz to zrobić, musisz zrobić to tak, jak już zrobiłeś, używając surowego SQL. –

Odpowiedz

22

Jak wszyscy odpowiedzieli, że nie jest naprawdę konieczne, aby przesunąć licznik z powrotem po usunięciu wiersza. Możesz jednak truncate utworzyć tabelę, która usunie wszystkie wiersze tabeli i zresetuje licznik.

Nie możesz truncate tabela, która ma Foreign Key Constraints stosowane na nim (truncate nie jest taka sama jak delete która po prostu usuwa wszystkie wiersze podczas utrzymanie licznik automatycznego przyrostu.).

W związku z tym, podczas korzystania z foreign key constrains, MySQL może powstrzymać cię od obcinania tabeli, która ma do niego zastosowany foreign key constraints.

Możesz wykonać następujące czynności, aby osiągnąć to, czego chcesz, ale pamiętaj, że może to zagrażać integralności danych. Używam go tylko do moich celów testowych .

  1. Edycja klasa DatabaseSeeder (który jest dostępny w app/database/seeds/DatabaseSeeder.php) w następujący sposób:

    <?php 
    class DatabaseSeeder extends Seeder { 
        /** 
        * Run the database seeds. 
        * 
        * @return void 
        */ 
        public function run() 
        { 
         Eloquent::unguard(); 
    
         // Disable Foreign key check for this connection before running seeders 
         DB::statement('SET FOREIGN_KEY_CHECKS=0;'); 
    
         $this->call('UserTableSeeder'); 
         // ... 
    
         // FOREIGN_KEY_CHECKS is supposed to only apply to a single 
         // connection and reset itself but I like to explicitly 
         // undo what I've done for clarity 
         DB::statement('SET FOREIGN_KEY_CHECKS=1;'); 
        } 
    } 
    
  2. Teraz klas Tabela siewnik (przykład UserTableSeeder w tym przypadku, który powinien być utworzony w app/database/seeds/UserTableSeeder.php) może nazywamy obcina tabeli (a) w sposób następujący:

    <?php 
    class UserTableSeeder extends Seeder { 
    
        public function run() 
        { 
         // Truncate the table. 
         DB::table('users')->truncate(); 
    
    
         // The auto-increment has been reset. 
         // Now we can start adding users. 
         User::create(
          array(
           'email' => '[email protected].com', 
           'password' => Hash::make('test') 
          ) 
         ); 
        } 
    } 
    
+0

tak, jeśli chcę skrócić tabelę. ale chciałem, aby następna auto_increment_value była kontynuowana tam, gdzie jest ostatni u_id: D – aimiliano

+0

@aimiliano Następnie możesz użyć 'DB :: table ('users') -> delete();'? :) –

+0

Nie, dziękuję, myślę, że jesteś poza tematem! – aimiliano

1

Nie wiem, czy to mądre, czy nie, ale to oczyści twój stół.

public function cleanup($table_name) 
{  
    DB::statement("SET @count = 0;"); 
    DB::statement("UPDATE `$table_name` SET `$table_name`.`id` = @count:= @count + 1;"); 
    DB::statement("ALTER TABLE `$table_name` AUTO_INCREMENT = 1;"); 
} 

MySQL ustawi AUTO_INCREMENT trwać + 1
Jeśli ustawić klucze obce ON UPDATE CASCADE dzieci będą wiedzieć o zmianach i kaskada aktualizację.

To zajmuje trochę czasu serwera i daje niewiele w zamian. Myślę, że właśnie dlatego otrzymujesz mnóstwo odpowiedzi "nie tnij swojego czasu"? Dla liczby należy użyć -> count(), a nie ostatniego id.

Nie wiem również, czy wyciągi powinny zawierać się w ramach transakcji, aby zapobiec błędom podczas dodawania użytkowników podczas wykonywania wyciągów.

+0

Co się stanie, jeśli zdecyduje się utworzyć migracje wstawiające predefiniowane dane? Jeśli wycofasz swoją migrację, czy nie powinieneś zresetować żadnych automatycznie wstawionych identyfikatorów do stanu sprzed migracji? – georaldc

+0

@georaldc Masz na myśli siew? Nie znalazłem mądrego sposobu na wysiewanie laravel. To jeden sposób. Mieszanie siewek i migracji wymaga kłopotów, jeśli mnie o to poprosisz. – Joeri

2
use Illuminate\Support\Facades\DB; 

public function refreshDB() 
{ 
    $max = DB::table('users')->max('id') + 1; 
    DB::statement("ALTER TABLE users AUTO_INCREMENT = $max"); 
} 

// Note: This solution is for resetting the auto_increment of the table without truncating the table itself 
Powiązane problemy