This article mainly introduces the Laravel framework's use of Seeder to realize the automatic data filling function, and analyzes the relevant operating techniques and precautions for Laravel's automatic filling of data based on the Seeder class in the form of examples. Friends in need can refer to the following
The example of this article describes the use of Seeder by the Laravel framework to realize the automatic data filling function. Share it with everyone for your reference, the details are as follows:
Laravel automatically fills data using the Seeder class
<?php use Illuminate\Database\Seeder; use Illuminate\Database\Eloquent\Model; class DatabaseSeeder extends Seeder { /** * Run the database seeds. */ public function run() { // } } class MyTableSeeder extends Seeder { public function run() { // } }
Your customized Seeder has only one run function, in which you write your automatic filling steps
You will notice these two functions
Model::unguard(); //你的填充操作 Model::reguard();
I used to be very confused about these two functions. What are they used for? I can only speculate that they are a pair of functions that work against each other. So I checked the source code.
These two functions are defined under Model.php under the directory \vendor\laravel\framework\src\Illuminate\Database\Eloquent
/** * Disable all mass assignable restrictions. * * @param bool $state * @return void */ public static function unguard($state = true) { static::$unguarded = $state; } /** * Enable the mass assignment restrictions. * * @return void */ public static function reguard() { static::$unguarded = false; }
See the Laravel author It can be known from the comments that it is an operation on data filling restrictions.
So unguard comes first and reguard comes after. unguard is responsible for lifting the automatic filling operation restrictions, and reguard is responsible for restoring the restrictions.
Before the filling operation, it is recommended to use the member function of the model
Model::truncate();
This function will clear the data table corresponding to the model, so please use it with caution.
<?php use Illuminate\Database\Seeder; use Illuminate\Database\Eloquent\Model; class DatabaseSeeder extends Seeder { /** * Run the database seeds. */ public function run() { Model::unguard(); $this->call('PostTableSeeder'); Model::reguard(); } } class PostTableSeeder extends Seeder { public function run() { App\Post::truncate(); factory(App\Post::class, 1000)->create(); } }
Some readers here may ask: Why don’t we write all the filling operations in the run function of the built-in DatabaseSeeder?
Because when we develop a complete system, there may be many data tables to be filled in, and we do not want to have to modify the run function in large numbers every time. We also want to retain the filling process every time we fill, so we would rather write a new class and then call it with the $this->call() function.
Next let’s talk about factory.
File Directory\database\factories\ModelFactory.php
$factory->define(App\Post::class, function ($faker) { return [ 'title' => $faker->sentence(mt_rand(3, 10)), 'content' => join("\n\n", $faker->paragraphs(mt_rand(3, 6))), 'published_at' => $faker->dateTimeBetween('-1 month', '+3 days'), ]; });
Although I can understand it, I don’t know what the $factory variable is? So check the Factory class to find it.
Find the source code in Factory.php in the directory \vendor\laravel\framework\src\Illuminate\Database\Eloquent
/** * Define a class with a given set of attributes. * * @param string $class * @param callable $attributes * @param string $name * @return void */ public function define($class, callable $attributes, $name = 'default') { $this->definitions[$class][$name] = $attributes; }
/** * Create an instance of the given model and persist it to the database. * * @param string $class * @param array $attributes * @return mixed */ public function create($class, array $attributes = []) { return $this->of($class)->create($attributes); }
Start filling in the data, we still use artisan Command line
php artisan db:seed
This command will execute the run functions of all the classes you wrote in DatabaseSeeder.php. If the project becomes complicated in the future, there is no need to execute the ones that have already been executed, so add parameters after the command line, as long as Just execute the run function of a certain class
php artisan db:seed --class=你要执行的类名称
The above is the entire content of this article. I hope it will be helpful to everyone's learning. For more related content, please pay attention to the PHP Chinese website!
Related recommendations:
About the binding operations of Laravel framework routing and controllers
For the life cycle of the Laravel framework Analysis of principles
Laravel framework routing settings
The above is the detailed content of Use the Seeder of the Laravel framework to implement the automatic data filling function. For more information, please follow other related articles on the PHP Chinese website!