php的seeder是什么,Laravel框架使用Seeder实现自动填充数据功能

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

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

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()

{

//

}

}

你自定义的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();

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

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();

}

}

这里有读者会问:为什么我们不把填充操作都写在自带的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'),

];

});

虽然能看懂,但是不知道这个$factory变量是什么?因此去查Factory类找。

在目录\vendor\laravel\framework\src\Illuminate\Database\Eloquent的Factory.php找到源代码

/**

* 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);

}

开始填充数据,我们还是使用artisan命令行

php artisan db:seed

这个命令会执行你写在DatabaseSeeder.php里面所有的类的run函数,如果以后项目复杂了,没有必要执行已经执行过的,所以在命令行后面加参数,只要执行某个类的run函数即可

php artisan db:seed --class=你要执行的类名称

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值