2012-10-04 12 views
48

Estoy recién aprendiendo Laravel y tengo un archivo de migración en funcionamiento que crea una tabla de usuarios. Estoy tratando de llenar un registro de usuario como parte de la migración:Rellenar una base de datos en un archivo de migración de 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' => '[email protected]', 
       'verified' => true 
      ) 
     ); 

    }); 
} 

Pero yo estoy recibiendo el siguiente error cuando se ejecuta php artisan migrate:

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

Esto es obviamente porque Artisan aún no ha creado la tabla, pero toda la documentación parece indicar que hay una forma de utilizar Fluent Query para completar datos como parte de una migración.

¿Alguien sabe cómo? ¡Gracias!

Respuesta

115

No ponga el DB :: insert() dentro del esquema :: create(), debido a que el método de crear tiene que terminar de hacer la tabla antes puede insertar cosas Pruebe esto en su lugar:

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' => '[email protected]', 
      'verified' => true 
     ) 
    ); 
} 
+0

Gracias Benjamin, ¡eso es excelente! –

+0

y cómo insertar datos múltiples? –

-4

intento: (no probado)

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' => '[email protected]', 
       'verified' => true 
      ) 
     ); 

    }); 
} 
+0

Gracias @ aowie1 - Ya lo había intentado, pero tiene errores porque 'Table :: insert()' no es un método válido –

1

Esto debería hacer lo que quiera.

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

Gracias @ strings28, pero ¿vio que ya había aceptado una respuesta similar hace un mes? –

+0

Aparentemente no lo hice - lo siento :) – strings28

9

Aquí es una muy buena explicación de por qué es preferible al uso de las migraciones mediante Sembradora base de datos de laravel: http://laravelbook.com/laravel-database-seeding/

Aunque, siguiendo las instrucciones de la documentación oficial es una idea mucho mejor debido a que la aplicación se describe en el el enlace de arriba no parece funcionar y está incompleto. http://laravel.com/docs/migrations#database-seeding

+1

Estoy de acuerdo contigo Erin. No mezcle migraciones con datos de inicialización porque es muy probable que desee generar algunos datos en su entorno de desarrollo, pero no en su entorno de producción. –

+10

Buen punto, pero hay algunas situaciones donde algunos datos deben existir en el entorno de producción. Por ejemplo, el primer usuario administrador predeterminado debe existir para que el cliente pueda iniciar sesión por primera vez, deben existir algunos roles de autorización preestablecidos, también se pueden requerir algunos datos lógicos de negocios inmediatamente. Por lo tanto, creo que los datos obligatorios se deben agregar a las migraciones (para que pueda subir/bajar también los registros de datos a través de migraciones separadas), pero las semillas pueden dejarse para el desarrollo. – JustAMartin

+0

Una pequeña nota; el enlace a la creación de bases de datos ahora es: https://laravel.com/docs/5.3/seeding – magikMaker

42

Sé que esta es una publicación anterior, pero dado que aparece en una búsqueda de Google, pensé que podría compartir algunos conocimientos aquí. @ erin-geyer señaló que mezclar migraciones y sembradoras puede generar dolores de cabeza y @justamartin respondió que a veces se necesita/necesita datos que se llenen como parte de su implementación.

Daría un paso más y diría que a veces es deseable implementar cambios de datos consistentemente para que pueda, por ejemplo, desplegar en etapas, ver que todo esté bien y luego implementar a producción con confianza de los mismos resultados (y no tiene que recordar ejecutar algún paso manual).

Sin embargo, todavía hay un valor para separar la semilla y la migración, ya que son dos preocupaciones relacionadas pero distintas. Nuestro equipo se ha comprometido creando migraciones que llaman a las sembradoras. Esto se ve así:

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

Esto le permite ejecutar una semilla una vez como una migración. También puede implementar lógica que previene o aumenta el comportamiento. Por ejemplo:

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

Esto obviamente ejecutaría condicionalmente su sembradora si hay menos de 10 modelos de algunos. Esto es útil si desea incluir la sembradora como una sembradora estándar que se ejecuta cuando llama al artisan db:seed y también cuando migra para no "duplicar". También puede crear una sembradora inversa para que las reversiones funcionen como se espera, p.

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

El segundo parámetro --force se requiere para permitir a sembradora para ejecutarse en un entorno de producción.

+1

Esta es, de lejos, la mejor respuesta. ¡Un código fácil de mantener que separa las preocupaciones! – helsont

+3

Tendría cuidado de considerar las implicaciones a largo plazo de llamar a las sembradoras desde las secuencias de comandos de migración. Los scripts de migración tienen una fecha/hora versionada, mientras que las sembradoras generalmente no lo son. Durante el desarrollo, las necesidades de las sembradoras a menudo cambian, lo que da como resultado la posibilidad de que los guiones de migración versionados ejecuten sembradoras sin versión, rompiendo la idempotencia. En otras palabras, ejecutar el mismo conjunto de scripts de migración día a día podría arrojar resultados diferentes. – originalbryan

+0

Ha pasado un tiempo desde que publiqué esto y quería brindar nuestra experiencia usando esta técnica. En general, nos ha funcionado bien y si tuviera que volver a hacerlo, lo haría. Eso dijo que hay que saber algo. @originalbryan es exactamente correcto y la consecuencia es que ocasionalmente nos encontramos con situaciones en las que las migraciones se rompen al girar una base de datos nueva porque a medida que migran las sembradoras (y el modelo) están más actualizadas que la base de datos (ya que podemos antes de que el esquema esté completamente actualizado). Cuando eso ocurre, actualizamos la migración anterior para solucionar el problema. – darrylkuhn

Cuestiones relacionadas