1 生成一个seeder文件

你可以通过 make:seeder artisan命令来生成一个 Seeder。所有通过框架生成的 Seeder 都将被放置在 database/seeds 路径:
php artisan make:seeder StudentsTableSeeder
在 seeder 类里只有一个默认方法:run。
我们可以在这个run方法中给数据库添加任何数据(在这里我们可以使用查询构造器或者Eloquent模型工厂)
我们给run方法添加如下内容
<?php

use Illuminate\Database\Seeder;
use DB;
use App\Models\Student; class StudentsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//使用基本查询构造器
DB::table('students')->insert([
'name' => str_random(10),
]);
//可以使用orm模型
Student::insert([
'name' => str_random(10),
]);
//还可以使用模型工厂
}
}

2 单独调用

运行命令,调用StudentsTableSeeder类 php artisan db:seed --class=StudentsTableSeeder
我们可以发现数据表中新插入了一条数据
这里要注意一个问题,因为我设计数据库的时候增加了created_at和updated_at字段,使用查询构造器并不能自动更新这两个字段

3 批量调用

Laravle 默认为你定义了一个 DatabaseSeeder 类。你可以在这个类中使用 call 方法来运行多个其它的 seed 类,以借此控制数据填充的顺序,并且可以实现批量调用。
我们将我们生成的StudentsTableSeeder类加入到 run方法中
<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model; class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard(); // $this->call(UserTableSeeder::class);
//这里我们可以调用更多生成的填充数据类,便于管理
$this->call(StudentsTableSeeder::class);
Model::reguard();
}
}
运行命令,调用DatabaseSeeder类
php artisan db:seed
我们同样可以发现数据表中多了一条数据
 

补充:模型工厂

 
我们刚才在run方法中使用的时候查询构造器,我们还可以使用Eloquent模型工厂
学习如何定义你的工厂,一旦工厂被定义(位于database/fatories文件夹下),就能使用 factory 这个辅助函数来添加数据到数据库。
 
涉及到两部分:
1>创建模型工厂,并调用
2>构造数据的时候可以使用 'Faker' 类,专门生成随机数据,可查看 'https://github.com/fzaninotto/Faker'
 

1 模型工厂示例

先查看下应用程序的 database/factories/ModelFactory.php 文件。此文件包含一个现成的工厂定义:
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'email' => $faker->email,
'password' => bcrypt(str_random(10)),
'remember_token' => str_random(10),
];
});
以上是对User 用户模型的定义
App\User::class 对应的就是你的模型位置,我自己在app目录下创建了Models文件夹用于存放各种模型,所以我这里要改成 App\Models\User::class
 
闭包内为工厂的定义,你可以返回模型中所有属性的默认测试值。在该闭包内会接收到 Faker PHP 函数库的实例,它可以让你很方便的生成各种随机数据以进行测试。

2 创建模型工厂

//示例 对应User模型
$factory->define(App\Models\User::class, function (Faker\Generator $faker) {
  return [
    'name' => $faker->name, //使用faker生成数据
    'email' => $faker->safeEmail,
    'password' => bcrypt(str_random(10)), //不使用faker生成数据
    'remember_token' => str_random(10),
  ];
}); //创建一个UserAccount模型的工厂
$factory->define(App\Models\UserAccount::class, function (Faker\Generator $faker) {
  return [
    'qq' => rand(10000,999999999999),
    'weixin' => $faker->userName,
    'weibo' => $faker->word,
  ];
}); //同一个UserAccount模型,不同的工厂
$factory->defineAs(App\Models\UserAccount::class,'mark', function (Faker\Generator $faker) {
  return [
    'qq' => rand(10000,999999999999),
    'weixin' => $faker->userName,
    'weibo' => $faker->word,
    'mark' => 1,
  ];
}); //同一个UserAccount模型,不同的工厂,第二种写法
//使用raw方法获取基本属性而不用重复基本用户工厂中的所有属性,获取这些属性后,只需将你要求的额外值增补进去即可
$factory->defineAs(App\Models\UserAccount::class,'mark2', function (Faker\Generator $faker) use($factory) {
// 注意向闭包函数传递变量使用use方法
  $user_account = $factory->raw(App\Models\UserAccount::class);
  return array_merge($user_account, ['mark' => 1]);
});
3 使用模型工厂
1> make()创建模型但不将其保存到数据库:  
       $user = factory(App\User::class)->make();    
2> 如果你想要覆盖模型的一些默认值,可以传递数组值到make方法。只有指定值被替换,其他数据保持不变:  
$user = factory(App\User::class)->make([  
'name' => 'dongxuemin'       // 会将生成的name替换为 'dongxuemin'  
]);  
3> 创建多个模型集合:  
$users = factory(App\User::class, 3)->make();  
4> 创建给定类型模型:  
$user = factory(App\User::class, 'admin')->make();  
5> 创建多个给定类型的集合:  
$user = factory(App\User::class, 'admin', 3)->make();  
6> 保存模型至数据库
可使用 create 方法来创建模型实例(相当于创建和保存两步)
$users = factory(App\Models\User::class)->create();
或者通过make方法得到模型实例后,使用 Eloquent 的 save 方法来将它们保存至数据库
$users = factory(App\Models\User::class)->make();
$users->save();
7>当使用 make 或 create 方法创建多个模型时,它会返回一个 Eloquent 集合实例,让你能够使用集合所提供的便利函数,像是 each
8>当模型中(app\Models文件夹下的model文件中)定义了关联关系时候,我们可以增加关联至模型
//使用基本的用户工厂创建一个用户,并使用基本的用户账号工厂
factory(App\Models\User::class)->create()->each(function($u) {
  $u->account()->save(factory(App\Models\UserAccount::class)->make());
});
//使用基本的用户工厂创建2个用户,并使用基本的用户账号工厂
factory(App\Models\User::class, 2)->create()->each(function($u) {
  $u->account()->save(factory(App\Models\UserAccount::class)->make());
});
//使用基本的用户工厂创建2个用户,并使用 "mark" 用户账号工厂
factory(App\Models\User::class, 2)->create()->each(function($u) {
  $u->account()->save(factory(App\Models\UserAccount::class,'mark')->make());
});
//使用基本的用户工厂创建2个用户,并使用 "mark2" 用户账号工厂
factory(App\Models\User::class, 2)->create()->each(function($u) {
  $u->account()->save(factory(App\Models\UserAccount::class,'mark2')->make());
});
分析:可以分为两部分理解,首先,在 factory(App\User::class, 2)->create() 这句中写明了,我们需要构建 User 类,在数据库中创建两个用户。然后,用 collection 的 each 方法为每个被创建的用户建立关联的问题数据,并且此部分使用了我们前面定义的不同工厂
 

laravel5.2总结--数据填充的更多相关文章

  1. Laravel5.1学习笔记18 数据库4 数据填充

    简介 编写数据填充类 使用模型工厂类 调用额外填充类 执行填充 #简介 Laravel includes a simple method of seeding your database with t ...

  2. Laravel 实践之路: 数据库迁移与数据填充

    数据库迁移实际上就是对数据库库表的结构变化做版本控制,之前对数据库库表结构做修改的方式比较原始,比如说对某张库表新增了一个字段,都是直接在库表中执行alter table xxx add .. 的方式 ...

  3. .net dataGridView当鼠标经过时当前行背景色变色;然后【给GridView增加单击行事件,并获取单击行的数据填充到页面中的控件中】

    1.首先在前台dataGridview属性中增加onRowDataBound属性事件 2.然后在后台Observing_RowDataBound事件中增加代码 protected void Obser ...

  4. ECharts SSH+JQueryAjax+Json+JSP将数据库中数据填充到ECharts中

    本文引用自:http://blog.csdn.net/ArcticFoxHan/article/details/38071641   1.导入包,搭建SSH框架 导入Jquery的JS包,<sc ...

  5. Laravel-高级篇-Auth-数据迁移-数据填充

    (慕课网_轻松学会Laravel-高级篇_天秤vs永恒老师_http://www.imooc.com/learn/702) 一.生成Auth所需文件 在Artisan控制台输入以下命令 php art ...

  6. highcharts柱状图和饼图的数据填充

    1.其实数据填充很简单,它们就是json的格式,然后后台按照这种格式去套数据发给前端:前端再做一下连接处理等就行了. $('#program_statistics_bar').highcharts({ ...

  7. Laravel 5.2 教程 - 数据填充

    一.简介 Laravel提供的填充类(seed),可以让大家很容易的实现填充测试数据到数据库.所有的填充类都位于database/seeds目录.填充类的类名完全由你自定义,但最好还是遵循一定的规则, ...

  8. CVPixelBuffer的创建 数据填充 以及数据读取

    CVPixelBuffer的创建数据填充以及数据读取 CVPixelBuffer 在音视频编解码以及图像处理过程中应用广泛,有时需要读取内部数据,很少的时候需要自行创建并填充数据,下面简单叙述. 创建 ...

  9. 将Json数据 填充到 实例类 的函数

    /// <summary> /// 将Json数据 填充到 实例类 /// </summary> /// <typeparam name="T"> ...

随机推荐

  1. cf1042F. Leaf Sets(贪心)

    题意 题目链接 给出一棵树,删除一些边,使得任意联通块内的任意点距离不超过$k$ sol 考场上想的贪心是对的:考虑一棵子树,如果该子树内最深的两个节点的距离相加$>k$就删掉最深的那个点,向上 ...

  2. java.lang.IllegalArgumentException: Document base F:\personal\projects\annoMVC\web does not exist or is not a readable directory

    tomcat明明在d盘,怎么到F盘了...纳闷啊... 解决办法: 1停掉Tomcat服务2把/conf/Catalina/localhost下的文件删除掉(我在这个文件夹里发现了一个xml,指向了F ...

  3. SSH中懒加载异常--could not initialize proxy - no Session

    SSH进行关联的表进行显示时出现的问题,老是显示你的OGNL表达式错误,但是找了很久确实没错,在网上找了一下,下面的这个方法本人认为是最有效的方法(已经测试可以使用) 在web.xml中加入 程序代码 ...

  4. vue-绑定style、css

    class.style的绑定1.在 v-bind 用于 class 和 style 时, Vue.js 专门增强了它.表达式的结果类型除了字符串之外,还可以是对象或数组2.绑定css2.1对象绑定2. ...

  5. LeetCode Remove Nth Node From End of List 删除链表的倒数第n个结点

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...

  6. linux 命令——41 ps(转)

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  7. linux 命令——25 linux文件属性详解

    Linux 文件或目录的属性主要包括:文件或目录的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容.具体情况如下: 命令: ls -lih 输出: [root@loca ...

  8. 【挖坑】2019年JAVA安全总结:SQL注入——新项目的开发与老项目的修复

    如何在项目中有效的防止SQL注入 写给需要的人,所有的问题源自我们的不重视. 本章略过"什么是SQL注入","如何去利用SQL注入"的讲解,仅讲如何去防御 PS ...

  9. JavaScript: apply , call 方法

    我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家 ...

  10. VERITAS NETBACKUP运维手册(自制)

    ps:本文为目录.详情请点如下目录超链接 1 VERITAS NETBACKUP介绍 1.1 NBU基本概念 1.2 配置存储单元 1.3 配置备份策略(Policy) 1.4 配置NetBackup ...