laravel省市区三级联动缓存数据api

550 阅读1分钟

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

一、省市区

为什么我们这里省市区要写在后台,为什么不直接让前端用前端组件,因为这边的话,我们最后走后台,数据可控制,如果前端一套web组件,一套小程序组件,或者一套app的组件,那么数据格式不一样,就会有各种问题,所以这个数据最好我们给前端。

1.1 添加省市县数据

database文件夹下新建sql文件夹,将省市县数据文件放入: 在这里插入图片描述 运行命令php artisan make:seeder CitySeeder 在这里插入图片描述CitySeeder.php中写入:

        // 创建省市区表,并填充数据
        DB::unprepared(file_get_contents(__DIR__.'/../sql/provinice_city_county_town.sql'));

在这里插入图片描述 运行填充命令:php artisan db:seed --class=CitySeeder 在这里插入图片描述 在这里插入图片描述 由于城市的数据比较多,所以在一开始填充之后写入辅助函数建立缓存:

    /**
     * 城市相关的缓存信息
     */
    if (!function_exists('city_cache')) {
        function city_cache($pid = 0) {
        // cache()->forget('city_children'.$pid);
            return cache() ->rememberForever('city_children'.$pid, function () use($pid) {
                return City::where('pid', $pid)->get()->keyBy('id');
            });
        }
    }

在这里插入图片描述


1.2 创建地址模型

创建city模型:php artisan make:model City在这里插入图片描述 设置属性让它去找city表,因为不找的话,它默认去找复数形式的: protected $table = 'city'; 在这里插入图片描述


1.3 创建地址控制器

运行命令php artisan make:controller CityController 在这里插入图片描述 在城市模型中加入关联的子类:

    /**
     * 子类
     */
    public function children() {
        return $this->hasMany(City::class, 'pid', 'id');
    }

在这里插入图片描述 控制器中写入:

    /**
     * 省市县数据
     */
    public function index(Request $request) {
        $resData = city_cache($request->query('pid', 0));
        return $resData;
    }

在这里插入图片描述


1.4 创建地址路由

        /**
         * 地址
         */
        $api->get('city', [CityController::class, 'index']);

在这里插入图片描述

1.5 测试效果

不传pid时获取到所有的省: 在这里插入图片描述 前端用户选中其中一个省,把id传进去获得市的数据: 在这里插入图片描述 将点击市,获取市下的数据: 在这里插入图片描述

在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。