{"id":21214303,"url":"https://github.com/goindow/chain-pdo","last_synced_at":"2025-10-11T00:35:29.025Z","repository":{"id":143903769,"uuid":"277428043","full_name":"goindow/chain-pdo","owner":"goindow","description":"链式 PDO 封装库，支持多数据源/数据库、链式操作、源生语句、事务处理等","archived":false,"fork":false,"pushed_at":"2021-06-28T06:57:49.000Z","size":2772,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-15T00:19:40.465Z","etag":null,"topics":["chain-pdo","pdo","sql"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/goindow.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-07-06T02:53:06.000Z","updated_at":"2021-06-28T06:57:51.000Z","dependencies_parsed_at":null,"dependency_job_id":"f45c2568-8f01-4907-b9cc-3f347ac5071d","html_url":"https://github.com/goindow/chain-pdo","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/goindow/chain-pdo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/goindow%2Fchain-pdo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/goindow%2Fchain-pdo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/goindow%2Fchain-pdo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/goindow%2Fchain-pdo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/goindow","download_url":"https://codeload.github.com/goindow/chain-pdo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/goindow%2Fchain-pdo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279005651,"owners_count":26083942,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-10T02:00:06.843Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chain-pdo","pdo","sql"],"created_at":"2024-11-20T21:27:12.160Z","updated_at":"2025-10-11T00:35:28.967Z","avatar_url":"https://github.com/goindow.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# chain-pdo\n链式 PDO 封装库，支持多数据源、数据库、链式操作、源生 sql、事务处理等\n\n## ChainPDOFactory\n- 通过 ChainPDOFactory 构建 ChainPDO 对象集合，根据数据源配置索引获取 ChainPDO 对象\n- 数据源配置项\n  - DB_TYPE，数据源类型，默认 mysql\n  - DB_CHAR，字符集，默认 utf8\n  - DB_PORT，端口地址，默认 3306\n  - DB_HOST，主机地址\n  - DB_NAME，数据库名\n  - DB_USERNAME，用户名\n  - DB_PASSWORD，密码\n  - DB_OPTIONS，PDO 实例化参数\n```php\n// $configSingle = [\n//     'DB_HOST' =\u003e '127.0.0.1',\n//     'DB_NAME' =\u003e 'test1',\n//     'DB_USERNAME' =\u003e 'root',\n//     'DB_PASSWORD' =\u003e '123456'\n// ];\n// $db = ChainPDOFactory::build($configSingle)-\u003egetDb();\n\n$configMulti = [\n    [\n        'DB_HOST' =\u003e 'localhost',\n        'DB_NAME' =\u003e 'test1',\n        'DB_USERNAME' =\u003e 'root',\n        'DB_PASSWORD' =\u003e '123456'\n    ],[\n        'DB_HOST' =\u003e '127.0.0.1',\n        'DB_NAME' =\u003e 'test2',\n        'DB_USERNAME' =\u003e 'root',\n        'DB_PASSWORD' =\u003e '123456'\n    ]\n];\n\n$chainPdoFactory =  ChainPDOFactory::build($configMulti);\n$db1 = $chainPdoFactory-\u003egetDb();    // default db index 0 - test1\n$db2 = $chainPdoFactory-\u003egetDb(1);   // db index 1 - test2\n```\n\n## ChainPDO\n### 链式条件\n- distinct()\n```php\n$db-\u003edistinct()-\u003eselect('user');\n```\n- field($field)\n```php\n$db-\u003efield(['id', 'user_name'])-\u003eselect('user');    // array\n\n$db-\u003efield('id, user_name')-\u003eselect('user');        // string\n```\n- join($join)\n```php\n$db-\u003efield(['o.id', 'o.price', 'o.status', 'u.id as user_id', 'u.user_name'])\n  -\u003ejoin('left join user as u on u.id = o.user_id')\n  -\u003eselect('`order` as o');\n```\n- where($where)\n```php\n$db-\u003ewhere(['user_name' =\u003e 'lisi'])-\u003eselect('user');    // array\n\n$db-\u003ewhere(\"user_name like '%an%'\")-\u003eselect('user');    // string\n```\n- group($group)\n```php\n$db-\u003efield(['user_id', 'status', 'sum(price) as price'])\n  -\u003egroup(['user_id', 'status'])\n  -\u003eselect('order');    // array\n\n$db-\u003efield(['user_id', 'status', 'sum(price) as price'])\n  -\u003egroup('user_id,status')\n  -\u003eselect('order');    // string\n```\n- having($having)\n```php\n$db-\u003efield(['user_id', 'status', 'sum(price) as price'])\n  -\u003egroup(['user_id', 'status'])\n  -\u003ehaving(['price' =\u003e 100])\n  -\u003eselect('order');    // array\n\n$db-\u003efield(['user_id', 'status', 'sum(price) as price'])\n  -\u003egroup(['user_id', 'status'])\n  -\u003ehaving('price \u003e= 200')\n  -\u003eselect('order');    // string\n```\n- order($order)\n```php\n$db-\u003eorder('id desc')-\u003eselect('user');\n```\n- limit($limit)\n  - UPDATE/DELETE 语句必须是整数(或整数字符串)，只支持 'Limit n'，不支持 'Limit offset,n'，否则 SQL 报语法错误\n```php\n// UPDATE/DELETE，仅能传递整数\n$db-\u003eorder('id desc')-\u003elimit(1)-\u003edelete('user')\n$db-\u003edata(['user_name' =\u003e 'zhaoliu'])-\u003elimit(1)-\u003eupdate('user')\n\n// SELECT\n$db-\u003elimit('3,1')-\u003eselect('user');\n```\n  - data($dataOrFields, $data = [])\n```php\n// UPDATE\n$db-\u003edata(['user_name' =\u003e 'zhaoliu'])-\u003ewhere(['user_name' =\u003e 'zhangsan'])-\u003eupdate('user');\n\n// INSERT 单行插入\n$db-\u003edata(['user_name' =\u003e 'zhangsan'])-\u003einsert('user');\n\n// INSERT 批量插入\n$fields = ['id', 'user_name'];\n$users = [[1, 'zhangsan'], [2, 'lisi'], [3, 'wangwu']];\n$db-\u003edata($fields, $users)-\u003einsert('user');\n```\n### 链式 CURD\n- insert($table, $onlyReturnSql = false)\n  - 支持的链式条件\n    - data($dataOrFields, $data = [])\n```php\n// INSERT 单行插入\n$db-\u003edata(['user_name' =\u003e 'zhangsan'])-\u003einsert('user');\n\n// INSERT 批量插入\n$fields = ['id', 'user_name'];\n$users = [[1, 'zhangsan'], [2, 'lisi'], [3, 'wangwu']];\n$db-\u003edata($fields, $users)-\u003einsert('user');\n```\n- delete($table, $onlyReturnSql = false)\n  - 支持的链式条件\n    - where($where)\n    - order($order)\n    - limit($limit)\n```php\n$db-\u003eorder('id desc')-\u003elimit(1)-\u003edelete('user')\n```\n- update($table, $onlyReturnSql = false)\n  - 支持的链式条件\n    - data($dataOrFields, [])\n    - where($where)\n    - order($order)\n    - limit($limit)\n```php\n$db-\u003edata(['user_name' =\u003e 'zhaoliu'])-\u003ewhere(['user_name' =\u003e 'zhangsan'])-\u003eupdate('user');\n```\n- select($table, $onlyReturnSql = false)\n  - 支持的链式条件\n    - distinct()\n    - field($field)\n    - join($join)\n    - where($where)\n    - group($group)\n    - having($having)\n    - order($order)\n    - limit($limit)\n    - data($dataOrFields, [])\n```php\n$db-\u003ewhere(['user_name' =\u003e 'lisi'])-\u003eselect('user');\n```\n- count($table, $onlyReturnSql = false)\n  - 支持的链式条件\n    - distinct()\n    - join($join)\n    - where($where)\n```php\n$db-\u003ewhere(['status' =\u003e 2])-\u003ecount('user');\n```\n### 原生 sql\n- sql($sql)\n```php\n$sql = \"INSERT INTO `user` (`user_name`) VALUES ('zhangsan')\";\n$insertId = $db-\u003esql($sql);\n```\n### 事务\n- beginTransaction()\n- commit()\n- rollback()\n```php\n$db-\u003ebeginTransaction();\ntry {\n    $sqlInsert1 = \"INSERT INTO `user` (`user_name`) VALUES ('zhangsan')\";\n    $db-\u003esql($sqlInsert1);\n\n    $sqlInsert2 = \"INSERT INTO `user` (`user_name`) VALUES ('lisi')\";\n    $db-\u003esql($sqlInsert2);\n    \n    $db-\u003ecommit();    \n} catch (Exception $e) {\n    $db-\u003erollback();\n} \n```\n\n## 测试报告\n![测试报告](https://github.com/goindow/chain-pdo/blob/master/test/report.png)\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoindow%2Fchain-pdo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgoindow%2Fchain-pdo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoindow%2Fchain-pdo/lists"}