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

Я пытался найти способ сбросить значение автоматического прироста в 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.

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

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

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

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

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

  1. Отредактируйте класс 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;'); } } 
  2. Теперь классы Table Seeder (пример, UserTableSeeder в этом случае, который должен быть создан в app/database/seeds/UserTableSeeder.php ), могут вызвать таблицу (ы) 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' => 'example@domain.com', 'password' => Hash::make('test') ) ); } } 

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

 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 (), а не последний id.

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