Estoy aprendiendo Laravel y tengo un archivo de migración en funcionamiento que crea una tabla de usuarios. Estoy tratando de completar un registro de usuario como parte de la migración:
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 recibo el siguiente error al ejecutar php artisan migrate
:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'vantage.users' doesn't exist
Obviamente, esto se debe a que Artisan aún no ha creado la tabla, pero toda la documentación parece decir que hay una forma de usar Fluent Query para completar datos como parte de una migración.
Alguien sabe como? ¡Gracias!
php
laravel
migration
mysql-error-1146
Adam Hopkinson
fuente
fuente
DB::table('users')->insert([ ['email' => '[email protected]', 'votes' => 0], ['email' => '[email protected]', 'votes' => 0] ]);
Sé que esta es una publicación antigua, pero como aparece en una búsqueda en Google, pensé en compartir algunos conocimientos aquí. @ erin-geyer señaló que la combinación de migraciones y sembradoras puede crear dolores de cabeza y @justamartin respondió que a veces desea / necesita que los datos se completen como parte de su implementación.
Yo iría un paso más allá y diría que a veces es deseable poder implementar cambios de datos de manera consistente para que pueda, por ejemplo, implementar en la etapa de pruebas, ver que todo está bien y luego implementar en producción con la confianza de los mismos resultados. (y no tener que acordarse de ejecutar algún paso manual).
Sin embargo, todavía es útil separar la semilla y la migración, ya que son dos preocupaciones relacionadas pero distintas. Nuestro equipo se ha comprometido al crear migraciones que llaman sembradoras. Esto se parece a:
Esto le permite ejecutar una semilla una vez como si fuera una migración. También puede implementar la lógica que previene o aumenta el comportamiento. Por ejemplo:
Obviamente, esto ejecutaría condicionalmente su sembradora si hay menos de 10 SomeModels. Esto es útil si desea incluir la sembradora como una sembradora estándar que se ejecuta tanto cuando llama
artisan db:seed
como cuando migra para no "duplicar". También puede crear una sembradora inversa para que los retrocesos funcionen como se espera, p. Ej.El segundo parámetro
--force
es necesario para permitir que la sembradora funcione en un entorno de producción.fuente
Aquí hay una muy buena explicación de por qué usar Database Seeder de Laravel es preferible a usar Migraciones: http://laravelbook.com/laravel-database-seeding/
Sin embargo, seguir las instrucciones de la documentación oficial es una idea mucho mejor porque la implementación descrita en el enlace anterior no parece funcionar y está incompleta. http://laravel.com/docs/migrations#database-seeding
fuente
Esto debería hacer lo que quieras.
fuente
Otra forma limpia de hacerlo es definir un método privado que cree la instancia y persista el Modelo en cuestión.
Con esta solución, los campos de marcas de tiempo serán generados por Eloquent.
EDITAR: es mejor usar el sistema de sembradoras para distinguir la generación de la estructura de la base de datos y la población de la base de datos.
fuente
$model = new App\UserRoles();
, pero aparte de eso ... ¡perfecto!Probé este método de inserción de base de datos, pero como no usa el modelo, ignoró un rasgo de sluggable que tenía en el modelo. Entonces, dado que existe el modelo para esta tabla, tan pronto como se migre, pensé que el modelo estaría disponible para insertar datos. Y se me ocurrió esto:
Esto funcionó correctamente y también tuvo en cuenta el rasgo sluggable en mi modelo para generar automáticamente un slug para esta entrada, y también usa las marcas de tiempo. NÓTESE BIEN. No era necesario agregar la identificación, sin embargo, quería identificaciones específicas para mis categorías en este ejemplo. Probado trabajando en Laravel 5.8
fuente
Si ya ha llenado columnas y ha agregado una nueva o desea completar la columna anterior con nuevos valores simulados, haga esto:
fuente