Seeder пропускает поле id при создании записей - PullRequest
0 голосов
/ 30 марта 2020

Сбой для одной из моих таблиц завершается с ошибкой

Подсветка \ База данных \ QueryException: SQLSTATE [HY000]: Общая ошибка: 1364 Поле 'id' не имеет значения по умолчанию значение (SQL: вставить в tests (name, description, panel_id, units, minValue, lowNote, maxValue, highNote, note_id ) значения (отношение A / G, отношение альбумина к глобулину, 2, 1,2, 2,5,, 1))

Обратите внимание, что поле id пропускается?

Вот метод миграции up():

public function up()
{
    Schema::create('tests', function (Blueprint $table) {
        $table->unsignedBigInteger('id');
        $table->string('name');
        $table->string('description');
        $table->unsignedBigInteger('panel_id');
        $table->string('units');
        $table->string('minValue');
        $table->string('lowNote',512);
        $table->string('maxValue');
        $table->string('highNote',512);
        $table->unsignedBigInteger('note_id');
    });
}

Вот часть метода TestSeeder::run():

$tests = [
    [
        'id' => 1,
        'name' => 'A/G Ratio',
        'description' => 'Albumin to Globulin Ratio',
        'panel_id' => 2,
        'units' => '',
        'minValue' => '1.2',
        'lowNote' => '',
        'maxValue' => '2.5',
        'highNote' => '',
        'note_id' => 1
    ],
];

Вот модель Test:

class Test extends Model
{
    public $timestamps = false;
    protected $fillable = [
    'id',
    'name',
    'description',
    'panel_id',
    'units',
    'minValue',
    'lowNote',
    'maxValue',
    'high_note',
    'note_id'
    ];
}

Обратите внимание, что поле id указано в массиве $fillable, так почему оно пропускается?

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Вам необходимо изменить эту строку:

$table->unsignedBigInteger('id');

на:

$table->bigIncrements('id');
0 голосов
/ 30 марта 2020

Laravel обрабатывает то, что он ожидает, чтобы быть первичным ключом, иначе, чем другие столбцы. Поскольку вы неправильно определили столбец в своей миграции, он не работает Попробуйте использовать это вместо:

public function up()
{
    Schema::create('tests', function (Blueprint $table) {
        $table->id();
        $table->foreignId('panel_id')->constrained();
        $table->foreignId('note_id')->constrained();
        // ...
    }
}

Это создаст id столбец , который автоматически увеличивается и настраивается в качестве первичного ключа таблицы. Также определит внешние ключи для автоматической ссылки на другие таблицы.


Я предполагаю, что вы используете последнюю версию Laravel - эти функции были введены в Laravel 7,0. Если вы все еще используете Laravel 6.x, тогда эта миграция делает то же самое, просто более подробно:

public function up()
{
    Schema::create('tests', function (Blueprint $table) {
        $table->bigIncrements('id');

        $table->unsignedBigInteger('panel_id');
        $table->foreign('panel_id')->references('id')->on('panels');

        $table->unsignedBigInteger('note_id');
        $table->foreign('note_id')->references('id')->on('notes');
        // ...
    }
}
...