这是我参与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的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。