Listening to the Words

laravel学习之帖子列表

初始化分类数据

面对数据库内容填充的需求,一般情况下我们会使用 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 帮我们生成了一堆文件,并在最后执行了数据库迁移:

《laravel学习之帖子列表》

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 本地作用域;

点赞