Introduce
- Laravel provides an easy way to create sample data in the database using seed classes.
- The seed classes are located in the
database/seeds
directory.
- Seed classes can have any name, but should be set according to some rules, such as
PostsTableSeeder
. - By default, the
DatabaseSeeder
class is made available, in this class you cancall
other seeds.
Create Seeders
- To create a seed, use the command
php artisan make:seed [tên_seed]
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">use</span> <span class="token package">Illuminate Database Seeder</span> <span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">PostsTableSeeder</span> <span class="token keyword">extends</span> <span class="token class-name">Seeder</span> <span class="token punctuation">{</span> <span class="token comment">/** * Run the database seeds. * * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">run</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
- A seed class only contains the default
run
. - This method will be called when running the command artisan cmd
php artisan db:seed
. - In the
run
method we will insert data.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">run</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$posts</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'id'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'title'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'Lập trình PHP'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'slug'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">str_slug</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'Lập trình PHP'</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'content'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'....'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'category_id'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">rand</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'id'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'title'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'Lập trình Ruby'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'slug'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">str_slug</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'Lập trình Ruby'</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'content'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'....'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'category_id'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">rand</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$posts</span> <span class="token keyword">as</span> <span class="token variable">$post</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> Post <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">create</span> <span class="token punctuation">(</span> <span class="token variable">$post</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span> <span class="token class-name"> Throwable</span> <span class="token variable">$th</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Use Factory
- Depending on the needs, users can insert data manually or use random data.
- Use the factory model to create multiple records.
- To create a factory, use the command
php artisan make:factory [tên_factory]
Example: PostFactory
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token comment">/** @var IlluminateDatabaseEloquentFactory $factory */</span> <span class="token keyword">use</span> <span class="token package">App Model</span> <span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Faker Generator</span> <span class="token keyword">as</span> Faker <span class="token punctuation">;</span> <span class="token variable">$factory</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">define</span> <span class="token punctuation">(</span> Model <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> Faker <span class="token variable">$faker</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span> <span class="token comment">//</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> </span> |
- We need to revise the model and start inserting data, below I use faker to create sample data.
- Some sample faker.
# | Syntax | Example results |
---|---|---|
first | $ faker-> randomDigit | 7 |
2 | $ faker-> word | ‘aut’ |
3 | $ faker-> name | ‘Dr. Zane Stroman ‘ |
4 | $ faker-> address | ‘8888 Cummings Vista Apt. 101, Susanbury, NY 95473 ‘ |
5 | $ faker-> phoneNumber | ‘201-886-0269 x3767’ |
6 | $ faker-> company | ‘Bogan-Treutel’ |
7 | $ faker-> text | ‘Dr. Zane Stroman ‘ |
9 | $ faker-> dateTime ($ max = ‘now’, $ timezone = null) | DateTime (‘2008-04-25 08:37:17’, ‘UTC’) |
ten | $ faker-> email | ‘ [email protected] ‘ |
11 | $ faker-> chrome | ‘Mozilla / 5.0 (Macintosh; PPC Mac OS X 10_6_5) AppleWebKit / 5312 (KHTML, like Gecko) Chrome / 14.0.894.0 Safari / 5312’ |
twelfth | $ faker-> hexcolor | ‘# fa3cc2’ |
13 | $ faker-> fileExtension | ‘avi’ |
14 | $ faker-> imageUrl ($ width = 640, $ height = 480) | The image URL is 640 x 480 in size |
15 | $ faker-> uuid | ‘7e57d004-2b97-0e7a-b45f-5387367791cd’ |
16 | $ faker-> ean13 | ‘4006381333931’ |
17 | $ faker-> md5 | ‘de99a620c50f2990e87144735cd357e7’ |
18 | $ faker-> randomHtml (2,3) | Create HTML documents no more than 2 levels deep and no more than 3 elements wide at all levels. |
1 2 3 4 5 6 7 8 9 10 | <span class="token variable">$factory</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">define</span> <span class="token punctuation">(</span> Post <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> Faker <span class="token variable">$faker</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$title</span> <span class="token operator">=</span> <span class="token variable">$faker</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">text</span> <span class="token punctuation">(</span> <span class="token number">10</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'title'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$title</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'slug'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">str_slug</span> <span class="token punctuation">(</span> <span class="token variable">$title</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'content'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$faker</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">text</span> <span class="token punctuation">(</span> <span class="token number">100</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'category_id'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">rand</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
- After the following definition, in the
run
function of thePostsTableSeeder
class we just need to callfactory(tên_lớp, số_lượng)->create()
.
1 2 3 4 5 | <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">run</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">factory</span> <span class="token punctuation">(</span> Post <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token punctuation">,</span> <span class="token number">100</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">create</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Calling Seeders
- In the DatabaseSeeder class, we can
call
other seed classes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">use</span> <span class="token package">Illuminate Database Seeder</span> <span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">DatabaseSeeder</span> <span class="token keyword">extends</span> <span class="token class-name">Seeder</span> <span class="token punctuation">{</span> <span class="token comment">/** * Seed the application's database. * * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">run</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">call</span> <span class="token punctuation">(</span> CategoriesTableSeeder <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">call</span> <span class="token punctuation">(</span> PostsTableSeeder <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
- Note when
call
the class must be in relative order. Example: Above we runCategoriesTableSeeder
first becausePostsTableSeeder
needscategory_id
to insert into the category_id column ofPostsTableSeeder
.
Running Seeders
- Before running, you should reload the file using
composer dump-autoload
- Using
php artisan db:seed
to run all files arecall
in classDatabaseSeeder
. - Specifies seed a
php artisan db:seed --class=UsersTableSeeder
classphp artisan db:seed --class=UsersTableSeeder
. - Use
php artisan migrate:fresh --seed
to delete all tables and then run the tables and seed again.
Conclude
- Seed allows quick sample creation and reuse.
- With Faker library allows you to create sample data that is more realistic.
- Beneficial for application development and test process