【问题标题】:Laravel seeder sets first record with ID 2Laravel 播种机创下 ID 2 的第一条记录
【发布时间】:2016-02-07 10:37:59
【问题描述】:

我正在尝试通过 DatabaseSeeder Laravel 为我的数据库播种,但是当它为数据库播种时,第一行的 ID 为 2 而不是 1。

DatabaseSeeder.php

public function run()
{

    foreach ($this->to_truncate as $table) {
        DB::table($table)->truncate();
    }

  $this->call('UsersTableSeeder');
}

UsersTableSeeder.php

use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        factory('App\User', 1)->create();
    }
}

ModelFactory.php

$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        'full_name' => 'Jakub Kohout',
        'username' => 'Admin',
        'email' => 'test@gmail.com',
        'password' => bcrypt('Uchiha'),
        'role_id' => 1
    ];
});

我的播种过程如下:

heroku run php artisan migrate
heroku run php artisan db:seed

这是我的用户模型的迁移:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('username');
        $table->string('email')->unique();
        $table->string('full_name');
        $table->integer('role_id')->unsigned();
        $table->string('password', 60);
        $table->rememberToken();
        $table->timestamps();
    });
}

【问题讨论】:

  • 请解释(显示工匠命令,修补命令)你如何运行你的种子和工厂(编辑问题)
  • 您的用户模型迁移是默认的(来自 Laravel)还是已修改?
  • 不,它已被修改,只是将其添加到问题中。
  • 去本地开发,打开终端使用$ php artisan tinker。同时去你的 phpmyadmin 或 Sequel Pro 并手动截断用户表 + 重置自动计数。在 Psy Shell (tinker) 中输入 factory(App\User::class, 1)->create()。输出是什么?
  • 所以我在 sequelPro 中手动截断表然后重置自动增量计数,但思想家仍然说这个 App\User {#752 full_name: "Jakub Kohout", username: "Admin", email: "test@ gmail.com”,role_id:1,updated_at:“2016-02-07 11:53:19”,created_at:“2016-02-07 11:53:19”,id:2,}

标签: php laravel laravel-5.1 seeding


【解决方案1】:

如果你的 ID 是自动增量的,并且你在之前放了 1 行然后删除它,那么第二行 ID 将为 2,它是 mysql 而不是 laravel。您可以通过删除表来解决此问题,然后使用从 1 开始的自动增量再次创建它。

或者你可以这样查询:

ALTER TABLE tablename AUTO_INCREMENT = 1

【讨论】:

  • 您也可以在播种前截断 TABLE table_name
  • 在每个种子之前,出于这个原因,我会截断所有表格。 foreach ($this->to_truncate as $table) { DB::table($table)->truncate(); }
  • 你的表有关系吗?
  • 所以,试着把它放在截断之前 DB::statement('SET FOREIGN_KEY_CHECKS=0;'); stackoverflow.com/questions/20546253/…
【解决方案2】:

我假设您使用的是 MySQL - 如果是这样,您可以运行以下命令:

SHOW VARIABLES LIKE 'auto_inc%';

它应该返回类似:

+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 10    |
| auto_increment_offset    | 2     |
+--------------------------+-------+

偏移量让您头疼。这两者都可以通过运行(在 MySQL 中)来设置:

SET @@auto_increment_increment=1;
SET @@auto_increment_offset=1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2023-02-23
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多