Как reset автоматическое увеличение при удалении пользователя laravel?

Я пытался найти способ reset значения автоматического увеличения в Laravel 4, но кажется, что эта функциональность не внедрена в laravel 4 по крайней мере пока. поэтому я сделал это следующим образом:

$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..');
                    }   
            }

каждый раз, когда я удаляю пользователя из базы данных, я устанавливаю указатель автоматического приращения на число всех пользователей +1.

Если у кого-то есть лучшее решение, сообщите мне, пожалуйста.

Ответ 1

Как и все остальные, нет необходимости переместить счетчик назад, когда вы удаляете строку. Однако вы можете truncate таблицу, которая удалит все строки таблицы и reset счетчика.

Вы не можете truncate использовать таблицу с Foreign Key Constraints (truncate), которая не совпадает с delete, которая просто удаляет все строки, а сохраняет счетчик автоматического увеличения.).

Следовательно, при использовании foreign key constrains MySQL может помешать вам обрезать таблицу, к которой применяется Foreign Key Constraints.

Вы можете выполнить следующие шаги для достижения того, чего хотите, но будьте осторожны, может быть риск для вашей целостности данных. Я использую его только для тестирования .

  • Отредактируйте класс DatabaseSeeder (который доступен в app/database/seeds/DatabaseSeeder.php) следующим образом:

    <?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;');
        }
    }
    
  • Теперь классы Table Seeder (Пример, UserTableSeeder в этом случае, который должен быть создан в app/database/seeds/UserTableSeeder.php), могут вызвать таблицу обрезания следующим образом:

    <?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]',
                    'password' => Hash::make('test')
                )
            );
        }
    }
    

Ответ 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 

Ответ 3

Я не знаю, разумно это или нет, но это очистит вашу таблицу.

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 установит AUTO_INCREMENT для продолжения + 1
Если вы установили внешние ключи в ON UPDATE CASCADE, дети узнают об изменениях и каскадируют обновление.

Этот материал занимает время сервера и дает вам немного взамен. Я думаю, почему вы получаете массу ответов "не делайте свое время"? Для подсчета следует использовать → count(), а не последний идентификатор.

Я также не знаю, должны ли операторы быть в транзакции для предотвращения ошибок при добавлении пользователей во время выполнения ваших операторов.

Ответ 4

Если вы используете PostgreSQL:

public function resetAutoincrement()
{
    $max = DB::table('users')->max('id') + 1;
    DB::statement('ALTER SEQUENCE users_id_seq RESTART WITH ' . $max);
}