Database Seeding
In version 0.5.0 Phinx introduced support for seeding your database with testdata. Seed classes are a great way to easily fill your database with data afterit’s created. By default they are stored in the seeds
directory; however,this path can be changed in your configuration file.
Note
Database seeding is entirely optional, and Phinx does not create a seeds
directory by default.
Creating a New Seed Class
Phinx includes a command to easily generate a new seed class:
- $ php vendor/bin/phinx seed:create UserSeeder
If you have specified multiple seed paths, you will be asked to select whichpath to create the new seed class in.
It is based on a skeleton template:
- <?php
- use Phinx\Seed\AbstractSeed;
- class MyNewSeeder extends AbstractSeed
- {
- /**
- * Run Method.
- *
- * Write your database seeder using this method.
- *
- * More information on writing seeders is available here:
- * http://docs.phinx.org/en/latest/seeding.html
- */
- public function run()
- {
- }
- }
The AbstractSeed Class
All Phinx seeds extend from the AbstractSeed
class. This class provides thenecessary support to create your seed classes. Seed classes are primarily usedto insert test data.
The Run Method
The run method is automatically invoked by Phinx when you execute the _seed:run_command. You should use this method to insert your test data.
Note
Unlike with migrations, Phinx does not keep track of which seed classes havebeen run. This means database seeders can be run repeatedly. Keep this inmind when developing them.
Inserting Data
Using The Table Object
Seed classes can also use the familiar Table
object to insert data. You canretrieve an instance of the Table object by calling the table()
method fromwithin your seed class and then use the insert()
method to insert data:
- <?php
- use Phinx\Seed\AbstractSeed;
- class PostsSeeder extends AbstractSeed
- {
- public function run()
- {
- $data = [
- [
- 'body' => 'foo',
- 'created' => date('Y-m-d H:i:s'),
- ],
- [
- 'body' => 'bar',
- 'created' => date('Y-m-d H:i:s'),
- ]
- ];
- $posts = $this->table('posts');
- $posts->insert($data)
- ->save();
- }
- }
Note
You must call the save()
method to commit your data to the table. Phinxwill buffer data until you do so.
Integrating with the Faker library
It’s trivial to use the awesomeFaker library in your seed classes.Simply install it using Composer:
- $ composer require fzaninotto/faker
Then use it in your seed classes:
- <?php
- use Phinx\Seed\AbstractSeed;
- class UserSeeder extends AbstractSeed
- {
- public function run()
- {
- $faker = Faker\Factory::create();
- $data = [];
- for ($i = 0; $i < 100; $i++) {
- $data[] = [
- 'username' => $faker->userName,
- 'password' => sha1($faker->password),
- 'password_salt' => sha1('foo'),
- 'email' => $faker->email,
- 'first_name' => $faker->firstName,
- 'last_name' => $faker->lastName,
- 'created' => date('Y-m-d H:i:s'),
- ];
- }
- $this->insert('users', $data);
- }
- }
Truncating Tables
In addition to inserting data Phinx makes it trivial to empty your tables usingthe SQL TRUNCATE
command:
- <?php
- use Phinx\Seed\AbstractSeed;
- class UserSeeder extends AbstractSeed
- {
- public function run()
- {
- $data = [
- [
- 'body' => 'foo',
- 'created' => date('Y-m-d H:i:s'),
- ],
- [
- 'body' => 'bar',
- 'created' => date('Y-m-d H:i:s'),
- ]
- ];
- $posts = $this->table('posts');
- $posts->insert($data)
- ->save();
- // empty the table
- $posts->truncate();
- }
- }
Note
SQLite doesn’t natively support the TRUNCATE
command so behind the scenesDELETE FROM
is used. It is recommended to call the VACUUM
commandafter truncating a table. Phinx does not do this automatically.
Executing Seed Classes
This is the easy part. To seed your database, simply use the seed:run
command:
- $ php vendor/bin/phinx seed:run
By default, Phinx will execute all available seed classes. If you would like torun a specific class, simply pass in the name of it using the -s
parameter:
- $ php vendor/bin/phinx seed:run -s UserSeeder
You can also run multiple seeders:
- $ php vendor/bin/phinx seed:run -s UserSeeder -s PermissionSeeder -s LogSeeder
You can also use the -v
parameter for more output verbosity:
- $ php vendor/bin/phinx seed:run -v
The Phinx seed functionality provides a simple mechanism to easily and repeatablyinsert test data into your database.