Заполнение базы данных в файле миграции Laravel


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

public function up()
{
    Schema::create('users', function($table){

        $table->increments('id');
        $table->string('email', 255);
        $table->string('password', 64);
        $table->boolean('verified');
        $table->string('token', 255);
        $table->timestamps();

        DB::table('users')->insert(
            array(
                'email' => 'name@domain.com',
                'verified' => true
            )
        );

    });
}

но я получаю следующую ошибку при запуске php artisan migrate:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'vantage.users' doesn't exist

это очевидно, потому что Artisan еще не создал таблицу, но вся документация, похоже, говорит о том, что есть способ использовать Fluent Query для заполнения данных в рамках миграции.

кто-нибудь знает как? Спасибо!

5 66

5 ответов:

не помещайте DB::insert() внутри схемы:: create(), потому что метод create должен закончить создание таблицы, прежде чем вы сможете вставить материал. Попробуйте вместо этого:

public function up()
{
    // Create the table
    Schema::create('users', function($table){
        $table->increments('id');
        $table->string('email', 255);
        $table->string('password', 64);
        $table->boolean('verified');
        $table->string('token', 255);
        $table->timestamps();
    });

    // Insert some stuff
    DB::table('users')->insert(
        array(
            'email' => 'name@domain.com',
            'verified' => true
        )
    );
}

Я знаю, что это старый пост, но так как он появляется в поиске google, я думал, что поделюсь некоторыми знаниями здесь. @erin-geyer отметил, что смешивание миграций и сеялок может создать головную боль, а @justamartin возразил, что иногда вы хотите/должны заполнять данные в рамках вашего развертывания.

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

тем не менее, все еще есть ценность в разделении семени и миграции, поскольку это две связанные, но разные проблемы. Наша команда пошла на компромисс, создав миграции, которые вызывают сеялки. Это выглядит так:

public function up()
{
    Artisan::call( 'db:seed', [
        '--class' => 'SomeSeeder',
        '--force' => true ]
    );
}

Это позволяет выполнить семя один раз так же, как миграция. Вы также можете реализовать логику, которая предотвращает или увеличивает поведение. Например:

public function up()
{
    if ( SomeModel::count() < 10 )
    {
        Artisan::call( 'db:seed', [
            '--class' => 'SomeSeeder',
            '--force' => true ]
        );
    }
}

это, очевидно, условно выполнить сеялку, если есть менее 10 SomeModels. Это полезно, если вы хотите включить сеялку в качестве стандартной сеялки, которая выполняется при вызове artisan db:seed а также при переносе, так что вы не "удвоить". Вы также можете создать обратную сеялку, чтобы откаты работали так, как ожидалось, например

public function down()
{
    Artisan::call( 'db:seed', [
        '--class' => 'ReverseSomeSeeder',
        '--force' => true ]
    );
}

второй параметр --force требуется, чтобы сеялка могла работать в режиме производственная среда.

вот очень хорошее объяснение того, почему использование сеялки базы данных Laravel предпочтительнее использования миграции:http://laravelbook.com/laravel-database-seeding/

хотя, следуя инструкциям на официальной документации является гораздо лучшей идеей, потому что реализация, описанная в приведенной выше ссылке, кажется, не работает и является неполной. http://laravel.com/docs/migrations#database-seeding

Это должно делать то, что вы хотите.

public function up()
{
    DB::table('user')->insert(array('username'=>'dude', 'password'=>'z19pers!'));
}

попробовать: (не проверял)

public function up()
{
    Schema::table('users', function($table){

        $table->increments('id');
        $table->string('email', 255);
        $table->string('password', 64);
        $table->boolean('verified');
        $table->string('token', 255);
        $table->timestamps();

        $table->insert(
            array(
                'email' => 'name@domain.com',
                'verified' => true
            )
        );

    });
}