laravel-5-model-factories

En versiones anteriores de Laravel usábamos componentes como Faker para crear datos de prueba y así poder crear una gran cantidad de registros de forma automática en nuestro proyecto de una forma muy sencilla, sin embargo se trataba de un componente externo que debíamos agregar o incluir en el proyecto. Desde ahora esta funcionalidad viene integrada en el núcleo de Laravel 5.1.

Model factories

Son una muy buena forma para crear datos de prueba en la aplicación, esta clase recibe una instancia de la clase Faker que permite generar una gran variedad de valores de forma aleatoria.

Puedes ver más sobre Faker en la pagina oficial del proyecto en GitHub.

Por defecto Laravel 5.1 trae consigo un ejemplo del uso de este nuevo componente, si vamos al archivo database/factories/ModelFactory.php veremos algo como esto :

$factory->define(App\User::class, function ($faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->email,
        'password' => str_random(10),
        'remember_token' => str_random(10),
    ];
});

Es aquí donde podemos definir los datos de prueba y retornarlos en forma de un array.

$factory->define();

Recibe como primer parámetro el modelo de la base de datos que deseamos usar, en ocasiones puede ocurrir el caso de que se desee crear datos de prueba de varios tipos como por ejemplo una serie de post activos o inactivos. para ello se puede usar.

$factory->define(App\Post::class, 'active');
$factory->define(App\Post::class, 'inactive');

Por supuesto siempre seguido del tercer parámetro que seria la función que devuelve el array de datos.

Seeders y Model Facories

Si queremos hacer el llamado a esta función para llenar la base de datos con información de prueba, podemos hacerlo desde el archivo database/seeds/DatabaseSeeder.php

public function run()
{
    factory('App\User', 50)->create();
}

Solo debemos hacer el llamado mediante

factory('App\User', 50)

Enviando como primer parámetro el modelo para el cual hemos definido los datos de prueba anteriormente y como segundo parámetro la cantidad de registros que deseamos crear.

De igual forma si quieres llamar a un tipo especifico que hayas definido, como en el ejemplo de los post activos e inactivos, puedes enviar ese valor como segundo parámetro y la cantidad de registros como un tercero.

$post = factory('App\Post', 'active')->make();

Veamos un ejemplo

Primero que todo recuerda configurar correctamente las credenciales de acceso a tu base de datos en el archivo .env de la aplicación.

Creamos un nuevo modelo con

$ php artisan make:model Post

Editamos el archivo app/Post.php

class Post extends Model
{
    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'posts';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['title', 'body', 'active'];
}

Creamos una nueva migración con

$ php artisan make:migration create_posts_table

Editamos el archivo de la migración

    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title')->unique();
            $table->text('body');
            $table->boolean('active');
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::drop('posts');
    }

Para crear un nuevo Model Factory vamos al archivo database/factories/ModelFactory.php

$factory->defineAs(App\Post::class, 'active', function ($faker) {
    return [
        'title'  => $faker->sentence(),
        'body'   => $faker->text,
        'active' => true,
    ];
});
$factory->defineAs(App\Post::class, 'inactive', function ($faker) {
    return [
        'title'  => $faker->sentence(),
        'body'   => $faker->text,
        'active' => false,
    ];
});

En este caso hemos creado dos tipos (active, inactive), ahora podemos agregar al archivo database/seeds/DatabaseSeeder.php

    public function run()
    {
        Model::unguard();
        $post = factory('App\Post', 'active', 5)->create();
        $post = factory('App\Post', 'inactive', 5)->create();
        Model::reguard();
    }

Finalmente para verificar que todo funcione ejecutamos la migración y el seeder con

$ php artisan migrate --seed

Ahora si verificamos la base de datos vemos que se han creado 10 registros para la tabla Posts, 5 activos y 5 inactivos.

model-factory-database

Como puedes ver es una forma muy sencilla de agregar información a tu base de datos, sin el uso de componentes externos.

Si te ha gustado la publicación recuerda compartir en redes sociales y no olvides dejar tus comentarios y sugerencias.

Lecturas recomendadas 

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Sistema de autenticación en Laravel 5.1 Lección siguiente Manejo de assets con Elixir y Gulp en Laravel 5.1