在一些中大型的应用架构设计中,通常会把模型分成数据层、逻辑层和服务层,控制器只会调用服务层方法。而查询逻辑则基本上被封装到逻辑层里面,数据层仅仅是做模型的各种定义。
而在简单的应用里面,也可以采用PHP的Trait机制来实现代码的复用机制。
用查询范围或搜索器简化查询
如果你使用模型查询的话,把你的查询条件尽量封装到查询范围或者搜索器方法里面,查询范围和搜索器的区别主要在于查询范围比较适合定义一组(多个字段)查询条件,如果要调用多个查询范围需要多次调用,而搜索器比较适合定义一个字段(其实并非绝对)的查询条件,只需要调用一次withSearch方法。
使用查询范围和搜索器的例子。
<?php namespace appindexmodel; use thinkModel; class User extends Model { public function scopeVip($query) { $query->where('user_type', 'vip') ->where('status', 1) ->field('id,name'); } public function searchAgeAttr($query, $age) { $query->where('age','>',$age); } public function searchScoreAttr($query, $score) { $query->where('score','<=',$score)->where('score', '>' ,0); } }
控制器代码
<?php namespace appindexcontroller; use thinkController; use thinkRequest; class index extends Controller { public function index(Request $request) { // 查询VIP会员 User::vip()->select(); // 查询年龄和分数 User::withSearch(['age,'score''], $request->param())->select(); } }
在控制器代码中,我们只关注业务逻辑本身,而不需要关注这个逻辑内部的查询条件是什么。更详细的关于搜索器和查询范围的内容可以参考官方手册。
PHP中文网,有大量免费的ThinkPHP入门教程,欢迎大家学习!
本文转自:https://blog.thinkphp.cn/833794