delete - php artisan make model
Laravel: Migrations & Seeding para datos de producción (2)
A menudo me he encontrado preguntándome cuál es la respuesta correcta para esto. Personalmente, evitaría usar siembra para completar las filas necesarias en la base de datos, ya que tendrá que cargar un montón de lógica condicional para asegurarse de que no intenta llenar algo que ya está allí. (Eliminar y volver a crear los datos es muy desaconsejable, ya que podría terminar con desajustes clave y si está utilizando eliminaciones en cascada, puede borrar accidentalmente un error de la base de datos ;-)
Puse la "siembra" de filas en el script de migración ya que es posible que los datos tengan que estar allí como parte del proceso de despliegue.
Vale la pena señalar que debe usar la clase DB en lugar de los modelos Eloquent para rellenar estos datos ya que la estructura de su clase podría cambiar con el tiempo, lo que le impedirá volver a crear la base de datos desde cero (sin reescribir el historial y cambiar los archivos de migración, Estoy seguro de que es algo malo.)
Tiendo a ir con algo como esto:
public function up()
{
DB::beginTransaction();
Schema::create(
''town'',
function (Blueprint $table) {
$table->increments(''id'');
$table->string(''name'');
$table->timestamps();
}
);
DB::table(''town'')
->insert(
array(
array(''London''),
array(''Paris''),
array(''New York'')
)
);
Schema::create(
''location'',
function (Blueprint $table) {
$table->increments(''id'');
$table->integer(''town_id'')->unsigned()->index();
$table->float(''lat'');
$table->float(''long'');
$table->timestamps();
$table->foreign(''town_id'')->references(''id'')->on(''town'')->onDelete(''cascade'');
}
);
DB::commit();
}
Esto me permite ''sembrar'' fácilmente la tabla de ciudades cuando la creo por primera vez, y no interferiré con las adiciones que se le hagan en el tiempo de ejecución.
Mi aplicación necesita un conjunto de datos previamente registrado para funcionar. Entonces necesito insertarlos en la base de datos cuando configuro la aplicación.
Laravel propone dos mecanismos:
- Migraciones de base de datos : "Permiten que un equipo modifique el esquema de la base de datos y se mantenga actualizado en el estado actual del esquema".
- Siembra de bases de datos : "Laravel también incluye una forma simple de inicializar su base de datos con datos de prueba utilizando clases semilla".
Cuando leo esta descripción, ninguna de estas soluciones parece estar adaptada.
Se ha formulado una pregunta similar sobre stackoverflow y se ha answered . La respuesta propone utilizar una sembradora de bases de datos para rellenar la base de datos mediante la detección del entorno actual:
<?php
class DatabaseSeeder extends Seeder {
public function run()
{
Eloquent::unguard();
if (App::environment() === ''production'')
{
$this->call(''ProductionSeeder'');
}
else
{
$this->call(''StagingSeeder'');
}
}
}
Por supuesto, esta solución funciona. Pero no estoy seguro de que sea la manera correcta de hacerlo, ya que al insertar datos utilizando sembradoras, se pierden todas las ventajas proporcionadas por el mecanismo de migración (actualización de la base de datos, reversión ...)
Quiero saber cuál es la mejor práctica en este caso.
El desarrollo de Laravel se trata de libertad. Entonces, si necesita sembrar su base de datos de producción y cree que DatabaseSeeder es el mejor lugar para hacerlo, ¿por qué no?
De acuerdo, la sembradora se usa principalmente con los datos de prueba, pero verás que algunas personas la usan tal como eres.
Veo este importante tipo de semilla como parte de mi migración, ya que esto es algo que no puede estar fuera de las tablas de mi base de datos y la artisan migrate
se ejecuta cada vez que despliegue una nueva versión de mi aplicación, por lo que hago
php artisan migrate:make seed_models_table
Y crea mi material seedind en él:
public function up()
{
$models = array(
array(''name'' => ''...''),
);
DB::table(''models'')->insert($models);
}