DEV Community

Jose Wisner Urrego Portilla
Jose Wisner Urrego Portilla

Posted on

2

¿Cómo truncar tus datos de prueba en Laravel 5.7?

Desde hace unos días me encuentro reforzando algunos conceptos sobre el framework Laravel (en su versión 5.7), he decidido retomar dicho marco para el desarrollo de APIs, así que decidí adquirir un curso en Udemy. En las primeras clases se abordó uno de mis conceptos favoritos de los framework de desarrollo, las migraciones. Después de hacer unas cuentas migraciones pasamos a las semillas de la API (Seeds, en ingles), una herramienta maravillosa para crear una buena base de datos para pruebas.

Es normal, que en un proceso de desarrollo continuo tengas alteraciones en tu base de datos y que, por consiguiente, debas recrear tanto la estructura de la base de datos; así como tus datos de prueba. Además, es común que tengas algunas restricciones de llaves foráneas que puedan generar algunos problemas a la hora de recrear tu base de datos.

Así que a continuación presentaré (por medio de un gist), la que para mí es la mejor forma de truncar tu base de datos, en este caso particular en mi clase administradora de semillas:

Please, don't use for disable foreign key constraints:

  DB::statement('SET FOREIGN_KEY_CHECKS=0;');
  // and
  DB::statement('SET FOREIGN_KEY_CHECKS=1;');

This is a MySQL specific statement, and your are using a ORM. The previous statement doesn't work in other database system (for example: MSSQL). Use something like what I describe in my DatabaseSeeder.php file.

view raw README.md hosted with ❤ by GitHub
<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
class DatabaseSeeder extends Seeder
{
// Your tables to truncate
protected $toTruncate = ['user'];
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
// This is a simple strategy for truncate your database.
// Disabled massive assignament restriction
Model::unguard();
// Disable foreign key check for this connection before running seeders
Schema::disableForeignKeyConstraints();
// Note: truncate strategy failed with SQL Server (and others).
foreach($this->toTruncate as $table) {
DB::table($table)->delete();
}
/**
* Your factories exections.
* For example:
* ************
*
* factory(User::class, 1000)->create();
*
*/
// Enable constraints
Schema::enableForeignKeyConstraints();
// Enable massive assignament restriction
Model::reguard();
}
}

Como lo describí en el gist (con mi mediocre ingles), no deberíamos hacer uso de sentencias nativas de MySQL (o cualquier otro modelo), desde nuestro frameworks, porqué, a no ser por un caso excepcional, estaríamos limitando la capacidad del ORM de funcionar en cualquiera de los motores de base de datos soportados (en el caso de Laravel, cuenta con soporte para MySQL, SQL Server y PostgreSQL).

Espero este post (mi primero de hecho), sea de utilidad para quien se encuentre iniciándose en este maravilloso Framework. Y estaré atento a cualquier duda y, claro, cualquier futuro aporte, pues he encontrado algunas cosas interesantes en muchos cursos de Udemy.

Retry later

Top comments (2)

Collapse
 
sleepyfran profile image
Fran González

Thanks for the post! I don't know what the community rules specify about it (I suppose @ben can give us some help here) but I think your post will do much more better if you used English instead of Spanish :)

Collapse
 
andres_gcarmona profile image
Andy Carmona • Edited

There is a DB::truncate() function you can use instead delete(), so if you are using MySQL the auto_increment counters resets to 0.

Retry later
Retry later