Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can we create a migration for the data, not just structure of the tables

I love laravel because of the ability to create migrations.

From what I understood, laravel gives us the capability to create a migration where we can repeat the same process without having to create tables and structures manually. My Question:

Similarly,

1) If I want that my data (inputs to the table) is also stored in some way, so that whenever i change the data in the database, that can also be reverted back or the whole process can also be recreated.

2) If 1 is not possible then can we have a way to save the methods for the "initial" seeding of the database. (so when we "factory" reset the whole thing, it can also automatically populate the content of the database, not just the structure of the database)

Any references for the same please?

I hope I was able to make myself clear!

like image 635
Nishant Sah Avatar asked Jan 28 '23 03:01

Nishant Sah


1 Answers

You're correct in assuming Laravel is incredible! So with respect to your first question.

1) If I want that my data (inputs to the table) are also stored in some way, so that whenever i change the data in the database, that can also be reverted back or the whole process can also be recreated.

If you you want to recreate the data you will need to create a table seeder. To do this, simply create a seeder and a factory with artisan.

php artisan make:seeder UsersTableSeeder

After making your seeder you can run it this with command:

composer dump-autoload && php artisan db:seed

If you wanted to create Controllers, Seeders and Factories at the same time when you make a model type this artisan command.

php artisan make:model User -fa

You can see more on the Laravel documentation for creating seeders and factories here.

Instead of messing with your migration files, I would create seeders. Here is a couple examples.

Exhibit 1 - Example of a an Article Factory (database/factories/ArticleFactory.php)

<?php

use Faker\Generator as Faker;

$factory->define(App\Article::class, function (Faker $faker) {
    return [
        'title' => $faker->text(50),
        'slug' => $faker->unique()->slug,
        'body' => $faker->text(200),
        'user_id' => rand(1,10),
    ];
});

Exhibit 2 - Example of an Article Seeder (database/seeds/ArticleTableSeeder.php)

<?php

use Illuminate\Database\Seeder;

class ArticlesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(App\Article::class, 10)->create();
    }
}

Exhibit 3 - Example of an Article Migration (database/migrations/2018_05_13_create_articles_table.php)

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateArticlesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('body');
            $table->string('slug');
            $table->integer('media_id')->nullable();
            $table->integer('user_id')->nullable(); // Owner of Article
            $table->timestamps();
            $table->softDeletes();

            $table->index('slug');

        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('articles');
    }
}

Exhibit 4 - DatabaseTableSeeder.php

    <?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

use Faker\Factory as Faker;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // Disable all mass assignment restrictions
        Model::unguard();


        // Seeds the Articles
        $this->call(ArticlesTableSeeder::class);

Then to do a complete factory reset, all you need to do is type the following artisan command:

php artisan migrate:db --fresh

php artisan db:seed

like image 195
Stackout Avatar answered Jan 31 '23 14:01

Stackout