首页 > 开发 > PHP > 正文

Laravel框架使用Seeder实现自动填充数据功能

2024-05-04 22:42:58
字体:
来源:转载
供稿:网友

本文实例讲述了Laravel框架使用Seeder实现自动填充数据功能。分享给大家供大家参考,具体如下:

要查看代码,可以点击链接:https://github.com/laravel/framework

Laravel自动填充数据使用的是Seeder类

<?phpuse 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()  {    //  }}

你自定义的Seeder只有一个run函数,里面写你的自动填充步骤

大家会注意到这两个函数

Model::unguard();//你的填充操作Model::reguard();

曾经对这两个函数非常疑惑,到底是干什么用的,只能推测是一对互为反作用的函数。于是去查了下源代码。

在目录/vendor/laravel/framework/src/Illuminate/Database/Eloquent下的Model.php下定义了这两个函数

/*** 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;}

看Laravel作者的注释可以知道,是对数据填充限制的操作。

所以unguard在前,reguard在后,unguard负责解除自动填充操作限制,reguard负责恢复限制。

在填充操作之前,建议使用模型的成员函数  

Model::truncate();

这个函数会清空这个模型所对应的数据表,所以请慎重使用。

<?phpuse 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();  }}

这里有读者会问:为什么我们不把填充操作都写在自带的DatabaseSeeder的run函数里呢?

因为我们开发一个完整的系统时,可能要填充的数据表有很多张,不希望每次都要大量修改这个run函数。我们还希望每次填充都能保留下这个填充的过程,所以我们宁愿新写一个类,然后用$this->call()函数来调用。

接下来我们来谈谈factory。

文件目录/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'),  ];});            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表