Laravel使用Seeder自动填充数据
来源:互联网 发布:陆羽茶经经典句子一知 编辑:程序博客网 时间:2024/06/05 00:38
要查看代码,可以点击
或者转到链接:https://github.com/laravel/framework
Laravel自动填充数据使用的是Seeder类
<?php
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();
这个函数会清空这个模型所对应的数据表,所以请慎重使用。
<?php
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使用Seeder自动填充数据
- laravel数据填充(seeder)及faker和tinker的使用
- Seeder自动填充测试数据
- Laravel学习笔记之Seeder填充数据小技巧
- laravel使用faker填充数据
- 将Laravel 数据表里的数据导出成 Seeder 文件
- 使用 Laravel 数据填充生成 中文 测试数据
- laravel (四) laravel 数据填充
- Laravel数据快速填充
- laravel 数据填充
- Laravel 的实用功能之一 数据库填充 使用数据工场
- 使用 Laravel 数据填充功能生成中文测试数据
- laravel数据迁移和填充
- Laravel 5.2 教程 - 数据填充
- Laravel框架数据迁移和填充
- Laravel框架数据迁移和填充
- laravel之seeder之操作(批量增,删,改)
- Laravel 自动生成数据字典
- 关于《Global contrast based salient region detection》环境配置
- linux驱动LCD对对程序之层次分析与框架
- Laravel中间件
- PAT(乙级)1004
- android- API 级别
- Laravel使用Seeder自动填充数据
- 动态规划实例(七):01背包问题最大价值
- Defining Python Source Code Encodings定义python源代码的编码
- 九度 题目1352:和为S的两个数字
- 数组与指针的区别
- iOS开发进阶
- java.io.IOException: Unable to establish loopback connection
- Laravel的ORM入门
- 文本框获取焦点后出现的边框,怎么去掉