本文实例讲述了Laravel框架使用Seeder实现自动填充数据功能。分享给大家供大家参考,具体如下:
Laravel自动填充数据使用的是Seeder类
?phpuse Illuminate/Database/Seeder;use Illuminate/Database/Eloquent/Model;html' target='_blank'>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 voidpublic static function unguard($state = true) static::$unguarded = $state;* Enable the mass assignment restrictions.* @return voidpublic 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 ),});
虽然能看懂,但是不知道这个$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 voidpublic 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 mixedpublic function create($class, array $attributes = []) return $this- of($class)- create($attributes);}
开始填充数据,我们还是使用artisan命令行
php artisan db:seed
这个命令会执行你写在DatabaseSeeder.php里面所有的类的run函数,如果以后项目复杂了,没有必要执行已经执行过的,所以在命令行后面加参数,只要执行某个类的run函数即可
php artisan db:seed -- >以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP !
相关推荐:
关于Laravel框架路由和控制器的绑定操作
对于Laravel框架的生命周期与原理分析
Laravel框架的路由设置
以上就是使用Laravel框架的Seeder实现自动填充数据功能的详细内容,PHP教程
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
新闻热点
疑难解答