初始化分类数据
面对数据库内容填充的需求,一般情况下我们会使用 Laravel 的 『数据填充 Seed』 。此一般是用来生成假数据,而现在我们需要生成的是项目的 初始化数据
虽然 Laravel 没有自带此类解决方案,不过数据迁移功能倒是比较不错的替代方案。在功能定位上,数据迁移也是项目的一部分,执行的时机刚好是在项目安装时。并且区分执行先后顺序,这确保了初始化数据发生在数据表结构创建完成后。
接下来我们使用命令生成数据迁移文件,作为 初始化数据 的迁移文件,我们定义命名规范为 seed_(数据库表名称)_data
:
$php artisan make:migration seed_categories_data
打开生成的迁移文件,并使用以下代码替换:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class SeedCategoriesData extends Migration
{
public function up()
{
$categories = [
[
'name' => '分享',
'description' => '分享创造,分享发现',
],
[
'name' => '教程',
'description' => '开发技巧、推荐扩展包等',
],
[
'name' => '问答',
'description' => '请保持友善,互帮互助',
],
[
'name' => '公告',
'description' => '站点公告',
],
];
DB::table('categories')->insert($categories);
}
public function down()
{
DB::table('categories')->truncate();
}
}
代码解析:
up()
方法中使用 DB 类的insert()
批量往数据表catetories
里插入数据$catetories
;down()
在回滚迁移时会被调用,是up()
方法的逆反操作。truncate()
方法为清空catetories
数据表里的所有数据。
执行迁移:
$ php artisan migrate
代码生成器
我们开发时遵守的代码风格是 Laravel 项目开发规范。遵照此规范,在实际操作中,有许多重复,接下来推荐一款专为此规范量身定制的代码生成器 —— Laravel 5.x Scaffold Generator 。
安装方式:
$ composer require "summerblue/generator:~0.5" --dev
我们在命令行中指定了数据模型还有具体的字段信息,运行命令后,generator 帮我们生成了一堆文件,并在最后执行了数据库迁移:
git clean -f -d
命令 git clean
作用是清理项目,-f
是强制清理文件的设置,-d
选项命令连文件夹一并清除。
即可看到 nothing to commit, working directory clean
的提示信息,表示项目文件已经清理干净
假数据填充
本地作用域
本地作用域允许我们定义通用的约束集合以便在应用中复用。要定义这样的一个作用域,只需简单在对应 Eloquent 模型方法前加上一个 scope
前缀,作用域总是返回 查询构建器。一旦定义了作用域,则可以在查询模型时调用作用域方法。在进行方法调用时不需要加上 scope 前缀
本地作用域的作用是达到代码的复用
.
.
.
class Topic extends Model
{
public function scopeWithOrder($query, $order)
{
// 不同的排序,使用不同的数据读取逻辑
switch ($order) {
case 'recent':
$query->recent();
break;
default:
$query->recentReplied();
break;
}
// 预加载防止 N+1 问题
return $query->with('user', 'category');
}
public function scopeRecentReplied($query)
{
// 当话题有新回复时,我们将编写逻辑来更新话题模型的 reply_count 属性,
// 此时会自动触发框架对数据模型 updated_at 时间戳的更新
return $query->orderBy('updated_at', 'desc');
}
public function scopeRecent($query)
{
// 按照创建时间排序
return $query->orderBy('created_at', 'desc');
}
}
<?php
class TopicsController extends Controller
{
public function index(Request $request, Topic $topic)
{
//调用方式,代码达到了复用的效果
$topics = $topic->withOrder($request->order)->paginate(20);
return view('topics.index', compact('topics'));
}
}
本章节中,我们学到了:
代码生成器;
使用数据迁移生成初始化数据;
使用『开发者工具栏』调优程序;
使用『预加载』修复 N +1 问题;
使用扩展包实现导航栏选中状态;
Laravel 本地作用域;