前面学了
Migrations
迁移建了数据表,现在可以学习数据库操作了。
先搞个控制器
php artisan make:controller DbController
当然路由也不能忘记
Route::prefix('db')->group(function () {
Route::get('insert', 'DbController@insert');
});
接下来给控制器写个 insert
方法
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
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
方法可以传要插入的数组,于是我改造那么一丢丢下面就是改造后的样子。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
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
类玩玩 ,运行 Artisan 命令
make:seeder
生成 Seeder
.
php artisan make:seeder TestTableSeeder
执行上面这个命令如果洗过脸会生成一个 database/seeds/TestTableSeeder.php
文件
可以看到里面有个 run
方法这个方法会在执行 db:seed
这个 Artisan
命令 时被调用,利用 DB 的方法写上要填充的内容,你也可以用 查询构造器
或 Eloquent 模型工厂
来手动插入数据。
Tip:使用数据填充时会自动禁用 批量赋值保护
<?php
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
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);
}
}
填充文件就算创建完成了,和迁移一样创建好文件写好内容就可以运行了,有一点要注意的是在完成 seeder
类的编写之后,你可能需要使用 dump-autoload
命令重新生成 Composer
的自动加载器
composer dump-autoload
现在我来用 Artisan
命令 db:seed
来填充数据库玩一玩
php artisan db:seed
执行完 php artisan db:seed
我发现数据库里毛的没有后来发现 这是因为填充比迁移多一个步骤,我发现 database/seeds
目录下还有个 DatabaseSeeder.php
文件,他默认就存在不是我创建的打开它里面也有个 run
方法并且里面有一行代码注释掉了 // $this->call(UsersTableSeeder::class);
翻看了 官方文档
才知道 db:seed
命令会去运行 DatabaseSeeder
类,在这个类可以用来调用其它 Seed
类 也就是我们需要仿照注释的示例在 DatabaseSeeder
类中去调用我刚刚创建的Seed
类 TestTableSeeder
。那么我去修改一下 DatabaseSeeder
类
<?php
use Illuminate\Database\Seeder;
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
类。
php artisan db:seed --class=TestTableSeeder
也可以用 migrate:refresh
这个命令来填充数据库,该命令会回滚并重新运行所有迁移。这个命令可以用来重建数据库
php artisan migrate:refresh --seed
另外在生产环境中强制使用一些填充操作可能会导致原有数据的更新或丢失。为了保护生产环境数据库的数据,在运行填充命令前会进行确认。可以添加 --force
选项来强制运行填充命令:
php artisan db:seed --force
相比于迁移,填充的价值就没有那么革命性了,而且填充更强大的功能需要模型的支持这个后面会学到的。