基础查询类 BaseQuery
```
<?php
namespace app\model;
use ReflectionClass;
use think\facade\Db;
use think\facade\Log;
class BaseQuery
{
var $tableName;
/**
* @param $tableName 【使用反射 获取model的表名】
*/
public function __construct($clazz)
{
$_tableName = findTableNameRef($clazz);
Log::info("初始化query tablename:{tablename}",[
"tablename"=>$_tableName,
]);
$this->tableName = $_tableName;
}
public function getQuery()
{
return Db::table($this->tableName);
}
public static function build($tableName)
{
$query = new BaseQuery($tableName);
return $query->getQuery();
}
}
function findTableNameRef($clazz)
{
$refPropety = null;
$ref = new ReflectionClass($clazz);
$proppertiesArray = $ref->getDefaultProperties();
return $proppertiesArray['name'];
}
```
使用
$query=BaseQuery::build(User::class)
$query->where()->limit()->page()->select();...
request参数装userDto类 【使用反射】
复制属性方法
public static function copyProperties($clazz, $data) {
$refObj = new ReflectionClass($clazz);
$ref_props = $refObj->getProperties();
$newObject = $refObj->newInstance();
for ($i = 0; $i < count($ref_props); $i++) {
$key = $ref_props[$i]->name;
$reflectionProperty = $refObj->getProperty($key);
if (isset($data) && isset($data[$key])) {
$reflectionProperty->setValue($newObject, $data[$key]);
}
}
return $newObject;
}
类型转换 提示php编译器可以提示类型
//看起来什么都没做 但是已经让编译器知道这个params是user::class类型了
就可以友好的编辑器提示
function toUser(User params){
return params
}
使用
在controller的方法里面
function list(Request $request){
$paramd=$request->all();
//得到 类的初始化 对象 userDto
$userDto=toUse(copyPropertie(UserDto::class,$paramd));
}
查询
$query=BaseQuery::build(User::class)
$query->where()->limit()->page()->select();...
修改 新增
User::save($userDto);
User::update($userDto, [ "id" => $userDto->id ]);
软删除
$result = BaseQuery::build(User::class)
->where("id", $id)
->useSoftDelete('delete_time', date("y-m-d H:i:s", time()))
->delete();
return Utils::ok($result);