laravel 学习之路 数据库操作 数据插入与数据填充

2019-12-18 17:39:31 浏览数 (1)

前面学了 Migrations 迁移建了数据表,现在可以学习数据库操作了。

数据插入

先搞个控制器

代码语言:javascript复制
php artisan make:controller DbController

当然路由也不能忘记

代码语言:javascript复制
Route::prefix('db')->group(function () {
    Route::get('insert', 'DbController@insert');
});

接下来给控制器写个 insert 方法

代码语言:javascript复制
<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;
use IlluminateSupportFacadesDB;

class DbController extends Controller
{
    //
    function insert(){
        DB::insert('INSERT INTO test (testID,title,email,`describe`) VALUES (1,"这是个title","123456@qq.com","这是个describe")');
    }
}

这里需要引入个 DB 类,DB 类就是我们操作数据库的关键,Db 类有个 insert 方法,它可以直接传插入内容的 sql 语句,现在我访问一 下 study.laraveltest.com/db/insert 如果没有报错数据就插入成功了。

确实是很简单吧!但是并不提倡这种拼接字符串的方式来添加数据,维护起来麻烦不说还不安全,所以我换种方式,DB 还有个 table 方法可以传表名再调用 insert 方法可以传要插入的数组,于是我改造那么一丢丢下面就是改造后的样子。

代码语言:javascript复制
<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;
use IlluminateSupportFacadesDB;

class DbController extends Controller
{
    //
    function insert()
    {
//        DB::insert('INSERT INTO test (testID,title,email,`describe`) VALUES (1,"这是个title","123456@qq.com","这是个describe")');

        $insertData = [
            [
                "testID"   => '2',
                "title"    => '这是个title2',
                "email"    => '22222@qq.com',
                "describe" => '这是个describe2',
            ],
            [
                "testID"   => '3',
                "title"    => '这是个title3',
                "email"    => '33333@qq.com',
                "describe" => '这是个describe3',
            ],

        ];
        DB::table('test')->insert($insertData);
    }
}

我在访问一 下 study.laraveltest.com/db/insert 然后查看数据库

数据填充

使用 DB 插入数据的方式学会后我们就可以讲点填充了,以前下载开源项目如果没有给出安装步骤,哪一般都先找 sql 文件,但是 sql 文件中一般不只是表结构一般还有一些初始化的数据昨天学习了表结构今天来玩玩数据,刚刚学习了插入数据的方式,但那是在控制器里的这种创建路由创建控制器写填充的方式不太优雅,laravel 是优雅的框架这么做跟 laravel 的优雅不符,所有 laravel 必定准备了其他方法,下面学下的填充就是向数据库批量添加数据的,简单概述下就是 数据库迁移 数据填充 = SQL

我们先来看看官网的介绍

Laravel 包含一个填充类可以为你的数据库填充测试数据,所有的填充类都放在 database/seeds 目录下。你可以随意为填充类命名,但是更建议您遵守类似 UsersTableSeeder 的命名规范。通常, Laravel 默认定义了一个 DatabaseSeeder 类。通过这个类,你可以用 call 方法来运行其它的 seed 类从而控制数据填充的顺序。

编写 Seeders

那么就先搞个 Seeders 类玩玩 ,运行 Artisan 命令 make:seeder 生成 Seeder.

代码语言:javascript复制
php artisan make:seeder TestTableSeeder

执行上面这个命令如果洗过脸会生成一个 database/seeds/TestTableSeeder.php 文件

可以看到里面有个 run 方法这个方法会在执行 db:seed 这个 Artisan 命令 时被调用,利用 DB 的方法写上要填充的内容,你也可以用 查询构造器Eloquent 模型工厂 来手动插入数据。

Tip:使用数据填充时会自动禁用 批量赋值保护

代码语言:javascript复制
<?php

use IlluminateDatabaseSeeder;
use IlluminateSupportFacadesDB;

class TestTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $insertData = [
            [
                "testID"   => '4',
                "title"    => '这是个title4',
                "email"    => '4444444@qq.com',
                "describe" => '这是个describe4',
            ],
            [
                "testID"   => '5',
                "title"    => '这是个title5',
                "email"    => '55555@qq.com',
                "describe" => '这是个describe5',
            ],

        ];
        DB::table('test')->insert($insertData);
    }
}

运行 Seeders

填充文件就算创建完成了,和迁移一样创建好文件写好内容就可以运行了,有一点要注意的是在完成 seeder 类的编写之后,你可能需要使用 dump-autoload 命令重新生成 Composer 的自动加载器

代码语言:javascript复制
composer dump-autoload

现在我来用 Artisan 命令 db:seed 来填充数据库玩一玩

代码语言:javascript复制
php artisan  db:seed

执行完 php artisan db:seed 我发现数据库里毛的没有后来发现 这是因为填充比迁移多一个步骤,我发现 database/seeds 目录下还有个 DatabaseSeeder.php 文件,他默认就存在不是我创建的打开它里面也有个 run 方法并且里面有一行代码注释掉了 // $this->call(UsersTableSeeder::class); 翻看了 官方文档 才知道 db:seed 命令会去运行 DatabaseSeeder 类,在这个类可以用来调用其它 Seed 类 也就是我们需要仿照注释的示例在 DatabaseSeeder 类中去调用我刚刚创建的SeedTestTableSeeder 。那么我去修改一下 DatabaseSeeder

代码语言:javascript复制
<?php

use IlluminateDatabaseSeeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // $this->call(UsersTableSeeder::class);
         $this->call(TestTableSeeder::class);
    }
}

不过这里需要主要一下填充文件的执行顺序,我们会创建很多填充文件如果有外键的话执行顺序不对是会报错的所以需要严格的自己指定顺序,OK我们在执行一下 php artisan db:seed 命令

数据终于写入数据库中了,当然 官方文档 也给出了其他的方式运行比如可以使用 --class 选项来指定一个特定的 seeder 类。

代码语言:javascript复制
php artisan db:seed --class=TestTableSeeder

也可以用 migrate:refresh 这个命令来填充数据库,该命令会回滚并重新运行所有迁移。这个命令可以用来重建数据库

代码语言:javascript复制
php artisan migrate:refresh --seed

另外在生产环境中强制使用一些填充操作可能会导致原有数据的更新或丢失。为了保护生产环境数据库的数据,在运行填充命令前会进行确认。可以添加 --force 选项来强制运行填充命令:

代码语言:javascript复制
php artisan db:seed --force

相比于迁移,填充的价值就没有那么革命性了,而且填充更强大的功能需要模型的支持这个后面会学到的。

0 人点赞