2024年6月22日17:14:12
req->getJsonObject()获取json数据的时候,如果没有提前判断
if (req->getJsonObject() == nullptr)
{
throw std::invalid_argument("参数json不能为空");
}
auto jsonPtr = req->getJsonObject();
官方文档:https://github.com/drogonframework/drogon/wiki/CHN-08-3-数据库-ORM#mapper的链式接口
Mapper的链式接口
有些常见的sql约束,比如limit,offset等等,Mapper类模板也提供了支持,以链式接口的形式提供,意味着用户可以把多个约束串起来写。执行完任何一个接口,这些约束会被清空,也就是说,这些约束是在一次操作中有效的,比如:
Mapper<Users> mp(dbClientPtr);
auto users = mp.orderBy(Users::Cols::_join_time).limit(25).offset(0).findAll();
注意这里的limit offset是sql的原意,不是我们常用的封装过的orm,所以需要自己去维护一下offset
这段程序是从users表中选择用户列表,每页25行的第一页
。
Json::Value ret;
ret["code"] = SUCCESS;
ret["msg"] = SUCCESS_MSG;
try
{
if (req->getJsonObject() == nullptr)
{
throw std::invalid_argument("参数json不能为空");
}
auto jsonPtr = req->getJsonObject();
// 转换指针
auto pJson = *jsonPtr;
LOG_DEBUG << pJson.toStyledString();
// 获取对应的参数
std::string page = pJson.get("page", 1).asString();
std::string pageSize = pJson.get("pageSize", 10).asString();
auto offset = (std::stoi(page) - 1) * std::stoi(pageSize);
auto clientPtr = drogon::app().getDbClient();
Mapper<Admin> mp(clientPtr);
LOG_DEBUG << std::stoi(pageSize);
LOG_DEBUG << std::stoi(page);
std::vector<Admin> admin_list = mp.orderBy(Admin::Cols::_id).limit(std::stoi(pageSize)).offset(offset).findAll();
auto count = admin_list.size();
auto list = admin_list;
Json::Value data;
data["count"] = count;
Json::Value json_list;
if (count > 0)
{
for (auto admin : admin_list)
{
json_list.append(admin.toJson());
}
}
data["list"] = json_list;
ret["data"] = data;
auto resp = HttpResponse::newHttpJsonResponse(ret);
resp->setStatusCode(k200OK);
callback(resp);
}
catch (std::exception &e)
{
ret["code"] = FAIL;
LOG_ERROR << e.what();
ret["msg"] = e.what();
auto resp = HttpResponse::newHttpJsonResponse(ret);
resp->setStatusCode(k200OK);
callback(resp);
}
链式接口基本可以望文生义,这里不再一一赘述,请参考Mapper.h头文件。