Use the Seeder of the Laravel framework to implement the automatic data filling function

不言
Release: 2023-03-31 20:46:01
Original
1914 people have browsed it

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()
  {
    //
  }
}
Copy after login

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();
Copy after login

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;
}
Copy after login

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();
Copy after login

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(&#39;PostTableSeeder&#39;);
    Model::reguard();
  }
}
class PostTableSeeder extends Seeder
{
  public function run()
  {
    App\Post::truncate();
    factory(App\Post::class, 1000)->create();
  }
}
Copy after login

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 [
    &#39;title&#39; => $faker->sentence(mt_rand(3, 10)),
    &#39;content&#39; => join("\n\n", $faker->paragraphs(mt_rand(3, 6))),
    &#39;published_at&#39; => $faker->dateTimeBetween(&#39;-1 month&#39;, &#39;+3 days&#39;),
  ];
});
Copy after login

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 = &#39;default&#39;)
{
    $this->definitions[$class][$name] = $attributes;
}
Copy after login
/**
* 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);
}
Copy after login

Start filling in the data, we still use artisan Command line

php artisan db:seed
Copy after login

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=你要执行的类名称
Copy after login

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!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template