Я просто изучаю 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 для заполнения данных в рамках миграции.
Кто-нибудь знает как? Благодаря!
Не кладите DB :: insert () внутри Schema :: 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 Database Seeder предпочтительнее использования Migrations: 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 ) ); }); }