Я пытался найти способ сбросить значение автоматического прироста в 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
применяемыми к ней.
Вы можете выполнить следующие шаги для достижения желаемого результата, но будьте осторожны, может быть риск для вашей целостности данных. Я использую его только для тестирования .
Отредактируйте класс 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
), могут вызвать таблицу (ы) 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.
Я также не знаю, должны ли операторы быть в транзакции для предотвращения ошибок при добавлении пользователей во время работы ваших операторов.