如何重置laravel用户删除中的自动增量?

时间:2013-12-12 14:32:25

标签: php laravel laravel-4 eloquent

我一直在努力找到一种方法来重置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。

如果有人有更好的解决方案,请告诉我..

4 个答案:

答案 0 :(得分:28)

像其他人一样回复说,删除一行时不需要移回计数器。但是,您可以truncate一个将删除所有表格行的表格并重置计数器。

你不能truncate已经Foreign Key Constraints应用的表格truncatedelete不同,foreign key constrains只会删除所有行,而保留< / strong>自动增量计数器。)。

因此,在使用foreign key constraints时,MySQL可能会阻止您截断已应用DatabaseSeeder的表。

您可以执行以下步骤来实现您的目标,但请注意,您的数据完整性可能存在风险。我只将其用于测试目的

  1. 编辑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;'); } } 获取),如下所示:

    UserTableSeeder
  2. 现在Table Seeder类(本例中为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') ) ); } } 创建)可以调用truncate table(s),如下所示:

    {{1}}

答案 1 :(得分:3)

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 

答案 2 :(得分:2)

我不知道它是否聪明,但这会清理你的桌子。

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,则子项将知道更改并级联更新。

这些东西需要服务器时间并且给你很少的回报。我认为这就是为什么你会得到“不要浪费时间”的反应? 对于计数,您应该使用 - &gt; count()而不是最后一个ID。

我也不知道语句是否应该在事务中,以防止在语句运行时添加用户时出现错误。

答案 3 :(得分:0)

如果您使用的是PostgreSQL

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