当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-09-27 09:59:29 浏览: 评论:0 

这篇文章主要介绍了Laravel框架使用Seeder实现自动填充数据功能,结合实例形式分析了Laravel基于Seeder类实现自动填充数据的相关操作技巧与注意事项,需要的朋友可以参考下。

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

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

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

  1. <?php 
  2. use Illuminate\Database\Seeder; 
  3. use Illuminate\Database\Eloquent\Model; 
  4. class DatabaseSeeder extends Seeder 
  5. { 
  6.   /** 
  7.    * Run the database seeds. 
  8.    */ 
  9.   public function run() 
  10.   { 
  11.     // 
  12.   } 
  13. } 
  14. class MyTableSeeder extends Seeder 
  15. { 
  16.   public function run() 
  17.   { 
  18.     // 
  19.   } 
  20. } 

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

大家会注意到这两个函数

  1. Model::unguard(); 
  2. //你的填充操作 
  3. Model::reguard(); 

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

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

  1. /** 
  2. * Disable all mass assignable restrictions. 
  3. * 
  4. * @param bool $state 
  5. * @return void 
  6. */ 
  7. public static function unguard($state = true) 
  8. { 
  9.     static::$unguarded = $state; 
  10. } 
  11. /** 
  12. * Enable the mass assignment restrictions. 
  13. * 
  14. * @return void 
  15. */ 
  16. public static function reguard() 
  17. { 
  18.     static::$unguarded = false; 
  19. } 

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

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

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

Model::truncate();

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

  1. <?php 
  2. use Illuminate\Database\Seeder; 
  3. use Illuminate\Database\Eloquent\Model; 
  4. class DatabaseSeeder extends Seeder 
  5. { 
  6.   /** 
  7.    * Run the database seeds. 
  8.    */ 
  9.   public function run() 
  10.   { 
  11.     Model::unguard(); 
  12.     $this->call('PostTableSeeder'); 
  13.     Model::reguard(); 
  14.   } 
  15. } 
  16. class PostTableSeeder extends Seeder 
  17. { 
  18.   public function run() 
  19.   { 
  20.     App\Post::truncate(); 
  21.     factory(App\Post::class, 1000)->create(); 
  22.   } 
  23. } 

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

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

接下来我们来谈谈factory。

文件目录\database\factories\ModelFactory.php

  1. $factory->define(App\Post::class, function ($faker) { 
  2.   return [ 
  3.     'title' => $faker->sentence(mt_rand(3, 10)), 
  4.     'content' => join("\n\n", $faker->paragraphs(mt_rand(3, 6))), 
  5.     'published_at' => $faker->dateTimeBetween('-1 month', '+3 days'), 
  6.   ]; 
  7. }); 

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

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

  1. /** 
  2. * Define a class with a given set of attributes. 
  3. * 
  4. * @param string $class 
  5. * @param callable $attributes 
  6. * @param string $name 
  7. * @return void 
  8. */ 
  9. public function define($class, callable $attributes, $name = 'default') 
  10. { 
  11.     $this->definitions[$class][$name] = $attributes; 
  12. } 
  13.  
  14. /** 
  15. * Create an instance of the given model and persist it to the database. 
  16. * 
  17. * @param string $class 
  18. * @param array $attributes 
  19. * @return mixed 
  20. */ 
  21. public function create($class, array $attributes = []) 
  22. { 
  23.     return $this->of($class)->create($attributes); 
  24. } 

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

php artisan db:seed

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

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

Tags: Laravel自动填充 Seeder

分享到: