IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> laravel数据填充(代码详解补充) -> 正文阅读

[PHP知识库]laravel数据填充(代码详解补充)

1、数据工厂

define 定义了一个指定数据模型(如此例子 User)的模型工厂。define 方法接收两个参数,第一个参数为指定的 Eloquent 模型类,第二个参数为一个闭包函数,该闭包函数接收一个 Faker PHP 函数库的实例,让我们可以在函数内部使用 Faker 方法来生成假数据并为模型的指定字段赋值。
我们需要增加 introduction 用户简介字段的填充,另外我们计划在 UsersTableSeeder 里使用 批量入库 的方式填充数据,因此需要自行填充 created_at 和 updated_at 两个字段。修改后的代码如下:
database/factories/UserFactory.php

<?php

use Illuminate\Support\Str;
use Faker\Generator as Faker;

$factory->define(App\Models\User::class, function (Faker $faker) {
    $date_time = $faker->date . ' ' . $faker->time;
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'remember_token' => Str::random(10),
        'email_verified_at' => now(),
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'introduction' => $faker->sentence(),
        'created_at' => $date_time,
        'updated_at' => $date_time,
    ];
});

Faker 是一个假数据生成库,sentence() 是 faker 提供的 API ,随机生成『小段落』文本。我们用来填充 introduction 个人简介字段。

2、数据填充

使用以下命令生成数据填充文件:

php artisan make:seed UsersTableSeeder

修改文件如以下:
database/seeds/UsersTableSeeder.php

<?php

use Illuminate\Database\Seeder;
use App\Models\User;

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        // 获取 Faker 实例
        $faker = app(Faker\Generator::class);

        // 头像假数据
        $avatars = [
            '/images/01.png',
            '/images/02.png',
            '/images/03.png',
            '/images/04.png',
            '/images/05.png',
        ];

        // 生成数据集合
        //use()方法连接闭包和外界的变量(使用外包变量,以及闭包函数传参)
        //说的更明白点:use关键字用来引用外部的变量
        //在函数内部通过使用use关键字,使用父函数的变量,这种方式叫闭包函数
        $users = factory(User::class)
                        ->times(10)
                        ->make()
                        ->each(function ($user, $index)
                            use ($faker, $avatars)
        {
            // 从头像数组中随机取出一个并赋值
            $user->avatar = $faker->randomElement($avatars);
        });

        // 让隐藏字段可见,并将数据集合转换为数组
        $user_array = $users->makeVisible(['password', 'remember_token'])->toArray();

        // 插入到数据库中
        User::insert($user_array);

        // 单独处理第一个用户的数据
        $user = User::find(1);
        $user->name = 'Summer';
        $user->email = 'summer@example.com';
        $user->avatar = '/images/pic.png';
        $user->save();

    }
}

代码讲解#

顶部使用 use 关键词引入必要的类。
factory(User::class) 根据指定的 User 生成模型工厂构造器,对应加载 UserFactory.php 中的工厂设置。
times(10) 指定生成模型的数量,此处我们只需要生成 10 个用户数据。
make() 方法会将结果生成为 集合对象。
each() 是 集合对象 提供的 方法,用来迭代集合中的内容并将其传递到回调函数中。
use 是 PHP 中匿名函数提供的本地变量传递机制,匿名函数中必须通过 use 声明的引用,才能使用本地变量。
makeVisible() 是 Eloquent 对象提供的方法,可以显示 User 模型 $hidden 属性里指定隐藏的字段,此操作确保入库时数据库不会报错。

1、

$age = 30;
$c = function ($name) use ($age){
?? ?echo 'this is' . $name .' Age is '. $age;
};

$c('jcc');

//闭包内需要调用外部的变量,需要使用use关键字来引用外部的变量

2、通过下面的代码能彻底明白UsersTableSeeder.php中,

->each(function ($user, $index) 里面$user 和 $index

<?php

$arr1 = ['张三', '李四', '王五', '赵六', '孙七'];
echo "<pre>";
var_dump($arr1);
echo "</pre>";


$to_arr1 = ' 是好人!';



//使用闭包函数,代替foreach

array_walk($arr1, function($v, $k) use ($to_arr1){
	
	echo $v;
	echo "<br>";
		echo $k;
	echo "<br>";
});

echo "<pre>";
var_dump($arr1);
echo "</pre>";

//--------------------

  • factory(App\User::class) 指明返回哪个工厂,参数 App\User::class 就是工厂的唯一标识。这里我们在定义工厂的时候 define 的第一个参数已经指明了。
  • ->times(10) 指明需要工厂模式生成 10 个 User 数据。即会调用 10 次 define 函数的第二个参数。
  • ->make() 把生成的 10 个 User 数据封装成 Laravel 中的集合对象。
  • ->each() 是 Laravel 集合中的函数,each 函数会针对集合中的每个元素进行操作。这里直接把数据保存到数据库

//---------------------

3、注册数据填充

接下来注册数据填充类,先去掉 $this->call(UsersTableSeeder::class); 的注释,还要注释掉我们还未开发 TopicsTableSeeder 调用:
database/seeds/DatabaseSeeder.php

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call(UsersTableSeeder::class);
        // $this->call(TopicsTableSeeder::class);
    }
}

4、使用以下命令运行迁移文件

php artisan db:seed

Laravel 中的数据迁移和数据填充

数据库测试:模型工厂生成及使用

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-24 15:19:43  更:2021-08-24 15:22:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:44:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码