• easyswoole 数据库相关操作集合大复盘


    初始化ORM连接池

    1.在dev.php 配置文件中配置其MYSQL数据库连接配置

    1. return [
    2. 'MYSQL' =>[
    3. 'host' => '',
    4. 'port' => 3300,
    5. 'user' => '',
    6. 'password' => '',
    7. 'database' => '',
    8. 'timeout' => 5,
    9. 'charset' => 'utf8mb4',
    10. ],
    11. ];

     2.在其EasyswooleEvent.php 进行注册

    1. namespace EasySwoole\EasySwoole;
    2. use EasySwoole\EasySwoole\Config;
    3. use EasySwoole\ORM\Db\Connection;
    4. use EasySwoole\ORM\DbManager;
    5. class EasyswooleEvent implements Event {
    6. public function initialize() {
    7. //MYSQL ORM连接池
    8. $mysql_config = Config::getInstance()->getConf('MYSQL');
    9. $config = new \EasySwoole\ORM\DB\Config($mysql_config);
    10. try {
    11. //连接池配置
    12. $config->setGetObjectTimeout(3.0); //设置获取连接池对象超时时间
    13. $config->setIntervalCheckTime(30*1000); //设置检测连接存活执行回收和创建的周期
    14. $config->setMaxIdleTime(15); //连接池对象最大闲置时间(秒)
    15. $config->setMinObjectNum(5); //设置最小连接池存在连接对象数量
    16. $config->setMaxObjectNum(20); //设置最大连接池存在连接对象数量
    17. $config->setAutoPing(5); //设置自动ping客户端链接的间隔
    18. DbManager::getInstance()->addConnection(new Connection($config));
    19. } catch (\Throwable $e) {
    20. var_dump('注册mysql连接池异常:'.$e->getMessage());
    21. }
    22. }
    23. }

    自定义SQL执行

    有时候你可能需要在查询中使用原生表达式。你可以使用 QueryBuilder 构造一个原生 SQL 表达式

    ORM 内部依赖的是 mysqli 组件的QueryBuilder

    1. namespace App\Model;
    2. use EasySwoole\Mysqli\QueryBuilder;
    3. //直接使用
    4. public function getData(){
    5. $queryBuild = new QueryBuilder();
    6. // 支持参数绑定 第二个参数非必传
    7. $queryBuild->raw("select * from test where name = ?", ['siam']);
    8. // $queryBuild->raw("select * from test where name = 'siam'");
    9. // 第二个参数 raw 指定true,表示执行原生sql
    10. // 第三个参数 connectionName 指定使用的连接名,默认 default
    11. $data = DbManager::getInstance()->query($queryBuild, true, 'default');
    12. return $data;
    13. }
    14. //采用invoke方式
    15. public function runSqlGetData($sql,$param){
    16. return DbManager::getInstance()->invoke(function ($client) use ($sql,$param) {
    17. $queryBuilder = new QueryBuilder();
    18. $query_raw_obj = $queryBuilder->raw($sql,$param);
    19. $res_obj = $client->query($query_raw_obj);
    20. //获取结果
    21. $result = $res_obj->getResult();
    22. return $result;
    23. });
    24. }

    在模型中使用 

     代码如下:

    1. namespace App\Model;
    2. use EasySwoole\Mysqli\QueryBuilder;
    3. use EasySwoole\ORM\DbManager;
    4. use EasySwoole\ORM\AbstractModel;
    5. class DepartModel extends AbstractModel
    6. {
    7. protected $tableName = 'region';
    8. //$field
    9. public function get_depart_region($where,$field="*")
    10. {
    11. $region = $this->where($where)
    12. ->field('*')
    13. ->withTotalCount()
    14. ->all();
    15. $total = $this->lastQueryResult()->getTotalCount(); //获取总条数
    16. $sql = $this->lastQuery()->getlastQuery(); //获取执行的sql
    17. return $this->lastQueryResult()->toArray();
    18. }
    19. }

     使用  $this->lastQueryResult()->toArray(); 获取结果

    使用 withTotalCount 与 $this->lastQueryResult()->getTotalCount() 获取其数据总条数

    获取执行的SQL 

    使用 $this->lastQuery()->getlastQuery(); //获取执行的sql

    发现 使用

    $this->lastQuery()->getlastQuery()  

    $this->lastQuery()->getLastQuery()

    $this->lastQuery()->getLastquery()  

    效果一样
    效果一样

    效果一样

    获取结果 

    1. 使用  $this->lastQueryResult()->toArray(); 获取结果

    2. 使用 $this->lastQueryResult()->getResult();  //获取结果  二维数组  多个结果

    3.使用 $this->lastQueryResult()->getResultOne();  //获取结果  一维数组  单个结果

    模型使用invoke 

    1. namespace App\Model;
    2. use EasySwoole\ORM\AbstractModel;
    3. use EasySwoole\ORM\DbManager;
    4. class ReginModel extends AbstractModel {
    5. protected $tableName = 'region';
    6. //采用invoke方式
    7. public function runSqlGetData($where,$field,$order,$pn,$page_size,$where2=""){
    8. return DbManager::getInstance()-invoke(function ($client) use
    9. ($where,$field,$order,$pn,$page_size,$where2) {
    10. $model = self::invoke($client);
    11. $model = alias('a');
    12. $model->where($where);
    13. if($where2!='') {
    14. $model->where($where2);
    15. }
    16. $model->join("user b",'b.id=a.user_id','left');
    17. ->limit(($pn-1)*$page_size , $page_size)
    18. ->field($field)
    19. ->order($order[0],$order[1])
    20. ->all();
    21. //获取结果
    22. $result = $model->lastQueryResult()->getResult();
    23. //var_dump($model->lastQuery()->getlastQuery()); //执行的SQL语句
    24. return $result;
    25. });
    26. }

    新增 、修改、删除操作

    代码如下:

    1. //新增
    2. public function addInfo($data) {
    3. return DbManager::getInstance()->invoke(function ($client) use ($data) {
    4. $m = self::invoke($client);
    5. return $m->data($data,false)->save(); //返回insert_id
    6. });
    7. }
    8. //批量新增
    9. //@param $data 二维数组
    10. public function addMutiInfo($data,$table_name){
    11. return DbManager::getInstance()->invoke(function ($client) use ($data,$table_name) {
    12. $query_builder = new QueryBuilder();
    13. $res_obj = $query_builder->insertAll($table_name,$data);
    14. $res_obj1 = $client->query($res_obj);
    15. return $res_obj1->getResult();
    16. });
    17. }
    18. //删除数据
    19. public function delInfo($where) {
    20. return DbManager::getInstance()->invoke(function ($client) use ($where) {
    21. $m = self::invoke($client);
    22. $result = $m->destroy($where);
    23. //var_dump($m->lastQuery()->getLastQuery());
    24. return $result;
    25. });
    26. }
    27. //修改数据
    28. public function updateInfo($data,$where) {
    29. return DbManager::getInstance()->invoke(function ($client) use ($data,$where) {
    30. $m = self::invoke($client);
    31. $m->update($data,$where);
    32. return $m->lastQueryResult()->getAffectedRows();
    33. });
    34. }

    使用ORM时,需要每个模型定义一个操作表,这样操作不方便,进而我们再次使用QueryBuilder进行封装  代码如下

    1. namespace App\Model;
    2. use EasySwoole\Mysqli\QueryBuilder;
    3. use EasySwoole\ORM\DbManager;
    4. class CommonModel extends QueryBulider{
    5. private static ?self $_instance = null;
    6. public function execute(){
    7. return DbManage::getInstance()->query($this,true)->getResult();
    8. }
    9. public function showData($where=[],$table_name,$field="*") {
    10. return $this->whereArray($where)->get($table_name,null,$field)->execute();
    11. }
    12. public function whereArray($where){
    13. foreach ($where as $key=>$value) {
    14. if(!is_array($value)) {
    15. $this->where($key,$value,'=');
    16. continue;
    17. }
    18. foreach( $value as $value2) {
    19. if(is_array($value2)) {
    20. $this->where($key,...$value);
    21. goto BREAK_EXECUTE;
    22. }
    23. }
    24. foreach( $value as $item) {
    25. $this->where($key,...$item);
    26. }
    27. goto BREAK_EXECUTE;
    28. continue
    29. }
    30. return $this;
    31. }
    32. }

     在使用是 直接调用模型 

    1. $model = new CommonModel();
    2. $where['id'] = 1;
    3. $table_name = "test";
    4. $field = "name,age";
    5. $data = $model->showData($where,$table_name,$field);


    分割线

    Mysqli

    安装

    composer require easyswoole/mysqli

     1.在dev.php 配置文件中配置其MYSQL数据库连接配置

    1. return [
    2. 'MYSQL' =>[
    3. 'host' => '',
    4. 'port' => 3300,
    5. 'user' => '',
    6. 'password' => '',
    7. 'database' => '',
    8. 'timeout' => 5,
    9. 'charset' => 'utf8mb4',
    10. ],
    11. ];

     2.在其EasyswooleEvent.php 进行注册

    1. namespace EasySwoole\EasySwoole;
    2. use EasySwoole\EasySwoole\Config;
    3. class EasySwooleEvent implements Event
    4. {
    5. public static function mainServerCreate(EventRegister $register)
    6. {
    7. $mysqlConfig = new \EasySwoole\Mysqli\Config(Config::getInstance()->getConf('MYSQL'));
    8. try {
    9. \EasySwoole\MysqliPool\Mysql::getInstance()->register('mysql', $mysqlConfig);
    10. } catch (MysqlPoolException $e) {
    11. echo "[Warn] --> mysql池注册失败\n";
    12. }
    13. }
    14. }

    使用BaseModel

    1. namespace App\Model;
    2. use EasySwoole\MysqliPool\Mysql;
    3. class BaseModel
    4. {
    5. protected $db;
    6. public function __construct(\EasySwoole\Mysqli\Mysqli $dbObject = null)
    7. {
    8. if (!$dbObject)
    9. $dbObject = Mysql::defer("mysql");
    10. $this->db = $dbObject;
    11. }
    12. public function getDb(): \EasySwoole\Mysqli\Mysqli
    13. {
    14. return $this->db;
    15. }

    使用模型  继承BaseModel 模型

    1. namespace App\Model;
    2. class UserModel extends BaseModel{
    3. protected $table = 'user';
    4. public function getUseableMonitorNum(){
    5. $num = $this->db->where("status",1)->count($this->table);
    6. return $num;
    7. }
    8. /**
    9. * 根据条件查询布控数据
    10. * @param $where str 查询条件
    11. */
    12. public function searchData($where,$field = '*'){
    13. if ($where) {
    14. $data = $this->db->where($where)->orderBy("cap_id",'desc')->get($this->table,null,$field);
    15. } else {
    16. $data = $this->db->orderBy("cap_id",'desc')->get($this->table,null,$field);
    17. }
    18. // var_dump($this->db->getLastQuery());
    19. if ($data) {
    20. return $data;
    21. }
    22. return [];
    23. }

     // var_dump($this->db->getLastQuery());   获取执行的sql

    2022年11月22日18:41:11  在使用Mysqli 是  其实也可以使用invoke 方式  代码如下:

    1. namespace App\Model;
    2. use EasySwoole\MysqliPool\Mysql;
    3. class TestModel {
    4. //获取数据
    5. public function getData(){
    6. //此处的mysql 由上面的注册名称 保持一致
    7. $data = Mysql::invoker('mysql',function ($conn) {
    8. return $conn->rawQuery('select version()');
    9. });
    10. var_dump($data);
    11. }
    12. }

  • 相关阅读:
    c++静态成员
    C语言二维数组定义、赋值、按要求遍历操作、输出以及函数调用
    变分推断公式推导
    JavaSE面试
    FusionCompute产品介绍
    优秀的图文识别开源项目PandaOCR
    电子器件 电阻参数与选型
    sklearn机器学习——day12
    软件工程及其文档汇总
    Android 9 导航栏添加截图按钮
  • 原文地址:https://blog.csdn.net/u013416034/article/details/126932766