Giter VIP home page Giter VIP logo

laravel-seedonce's Introduction

Build Status Total Downloads Latest Stable Version License

Laravel SeedOnce

This package works similar to php artisan migrate. When using this package, each seeder is seeded only once even if you run php artisan db:seed multiple times (on each deployment).

Why was this package developed?

The purpose of this package is to make it easier for the developers to run seeders when working in teams and to run seeders during automated deployments. One doesn't need to remember which seeders have already been executed and which are pending. All this is handled by this package.

Assumption

This package assumes that you use one seeder (ex.DatabaseSeeder) class as the main/parent for running all other seeders. This main seeder class should never seed any data directly on its own. It should only be used to run other seeder classes.

Installation

Use composer to install the package.

composer require ranium/laravel-seedonce

Optionally, publish the package configuration file. Default config should work well in most of the cases.

php artisan vendor:publish --tag=laravel-seedonce-config

After the package is installed by composer, run the migrations to create a table which will hold the seeder information.

php artisan migrate

Note: This will create a table named seeders in your database. If you want to change this table's name, then you have to publish the package's config (above step) and modify the value of table in config/seedonce.php.

Configuration

Once you have published the configuration file, you can edit it to suit your needs. Configuration options are as follows:

  • table: This is the name of the table that will hold the details of the seeders that have been executed. The default value is seeders which should work in most of the cases.
  • database_seeder: This is the name of the class that seeds all other seeders. In most of the cases this will be DatabaseSeeder which is the default value. Make sure to change this if you use a different class as the entry point to seed all other seeders.
  • folder_seeder: This is the folder of contains the seeders files laravel < 8 use seeds and laravel >= 8 use seeders

Usage

Use the Ranium\SeedOnce\Traits\SeedOnce trait in all your seeder classes including the main seeder (ex. DatabaseSeeder) class.

<?php
File: database/seeds/DatabaseSeeder.php

use Illuminate\Database\Seeder;
use Ranium\SeedOnce\Traits\SeedOnce;

class DatabaseSeeder extends Seeder
{
    use SeedOnce;

    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UsersTableSeeder::class);
        $this->call(RolesTableSeeder::class);
    }
}
?>

<?php
File: database/seeds/UsersTableSeeder.php

use Illuminate\Database\Seeder;
use Ranium\SeedOnce\Traits\SeedOnce;

class UsersTableSeeder extends Seeder
{
    use SeedOnce;

    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // User table seeder logic
    }
}
?>

That's it. Now no matter how many times you run php artisan db:seed, the UsersTableSeeder will only be executed once.

Projects with existing seeders

The usage instructions above assumes that you have installed this package before running any seeders. If you have already executed some or all seeders before installing this package, then you will need to mark those seeders as executed.

Run the following command to mark all existing seeder classes as seeded.

php artisan seedonce:mark-seeded

If you only want to mark specific seeder class as seeded, then run this command

php artisan seedonce:mark-seeded --class=UsersTableSeeder

Seeders Status

Often you would want to know that status of your seeder classes i.e. which seeders have been executed and which are pending. Run the following command to get the status

php artisan seedonce:status

This will output a table with status of each seeder class

Seeded? Seeder
Yes UsersTableSeeder
No RolesTableSeeder

Testing

The package unit tests can be executed with the following command (from inside package's root directory)

composer test

Credits

License

The MIT License (MIT). Please see License File for more information.

laravel-seedonce's People

Contributors

abbasali avatar chiranjeeb-ranium avatar medeiroz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

laravel-seedonce's Issues

Don't mark failed seeders as seeded.

I think it would be extremely useful for there to be an option or a trait that we can add to a seeder to not mark the seeder as seeded if there is an error while running a given seeder. Could this be added?

Option to unmark a given seeder

Is it possible to include unmark a given seed as unseeded command like we have mark-seeded ? So that we can run the unmarked seed file again

default directory of seeders has a wrong name and the comparisons between the seeders table and the class names is not usable

I have noticed that in line 75 of the BaseCommand.php class it does not have the correct name of the seeders folder, so I could correct it this way

return Collection::make($this->laravel->databasePath().DIRECTORY_SEPARATOR.'seeders'.DIRECTORY_SEPARATOR)

Also, when running the command, I realized that although there was already a record of seeders classes inside the seed table, the command php artisan seedonce: status kept showing me that no seed had been made, so I could fix it by modifying the following function inside Status.php

/**
* Get the status for the given seeded seeders
*
* @param array $seeded
* @param array $availableSeeders
* @return \Illuminate\Support\Collection
*/
protected function getStatusFor(array $seeded, Collection $availableSeeders)
{
$seeded = collect($seeded)->map(function ($_seeded){
return class_basename($_seeded);
})->toArray();

    return Collection::make($availableSeeders)
                ->map(function ($seeder) use ($seeded) {
                    return in_array($seeder, $seeded)
                            ? ['<info>Yes</info>', $seeder]
                            : ['<fg=red>No</fg=red>', $seeder];
                });
}

It is my first contribution to a third party package, so if I did something wrong let me know

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.