{"id":29311443,"url":"https://github.com/badueny/ci3-model-builder","last_synced_at":"2026-05-19T04:38:02.387Z","repository":{"id":302478344,"uuid":"1012585941","full_name":"badueny/ci3-model-builder","owner":"badueny","description":"Model dinamis gaya Laravel Query Builder untuk CI3, mendukung fitur-fitur kompleks seperti transaksi, relasi bertingkat, upsert massal, dan lainnya, Compatible PHP 5.6 s.d 8.0","archived":false,"fork":false,"pushed_at":"2025-07-02T16:15:12.000Z","size":54,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-02T16:25:33.188Z","etag":null,"topics":["ci3","model","mysql","query"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/badueny.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null}},"created_at":"2025-07-02T14:58:01.000Z","updated_at":"2025-07-02T16:15:16.000Z","dependencies_parsed_at":"2025-07-02T16:25:35.172Z","dependency_job_id":"fa440423-68a3-4c44-832d-24cb499480a9","html_url":"https://github.com/badueny/ci3-model-builder","commit_stats":null,"previous_names":["badueny/ci3-model-builder"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/badueny/ci3-model-builder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/badueny%2Fci3-model-builder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/badueny%2Fci3-model-builder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/badueny%2Fci3-model-builder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/badueny%2Fci3-model-builder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/badueny","download_url":"https://codeload.github.com/badueny/ci3-model-builder/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/badueny%2Fci3-model-builder/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33202000,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-18T09:27:30.708Z","status":"online","status_checked_at":"2026-05-19T02:00:06.763Z","response_time":58,"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":["ci3","model","mysql","query"],"created_at":"2025-07-07T08:14:48.225Z","updated_at":"2026-05-19T04:38:02.372Z","avatar_url":"https://github.com/badueny.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 📘 GeneralModel for CodeIgniter 3\r\n\r\nModel dinamis gaya Laravel Query Builder untuk CI3, mendukung fitur-fitur kompleks seperti transaksi, relasi bertingkat, upsert massal, dan lainnya, Compatible `PHP 5.6 s.d 8.0`.\r\n\r\n---\r\n\r\n## ✅ Fitur Utama\r\n| Fitur                                   | Deskripsi                                             |\r\n| --------------------------------------- | ----------------------------------------------------- |\r\n| `withDeepNestedMany()`                  | Relasi one-to-many bertingkat otomatis (nested)       |\r\n| `transaction()`                         | Transaksi DB otomatis dengan rollback on error        |\r\n| `increment() / decrement()`             | Tambah/kurangi nilai kolom langsung di DB             |\r\n| `upsertMany()`                          | Bulk insert dengan ON DUPLICATE KEY UPDATE            |\r\n| Integrasi DataTables                    | Query builder kompatibel untuk datatables server-side |\r\n| Soft Delete                             | Nonaktifkan data tanpa hapus fisik                    |\r\n| `remember()` / `cacheForget()`          | Auto caching query                                    |\r\n| `paginate()`                            | Pagination otomatis                                   |\r\n| `count() / sum() / avg()`               | Fungsi agregat bawaan                                 |\r\n| `likeGroup()`                           | LIKE multiple kolom sekaligus dengan grouping         |\r\n| `orWhere() / orLike()`                  | Pencarian fleksibel                                   |\r\n| `whereIn()` / `orHaving()` / `having()` | Kondisi lanjutan untuk query builder                  |\r\n\r\n## Contoh Penggunaan\r\n\r\n### 1. withDeepNestedMany()\r\n\r\n**Relasi one-to-many bertingkat otomatis.**\r\n\r\n```php\r\n$this-\u003eGeneralModel-\u003etabel('branches')-\u003ewithDeepNestedMany([\r\n  'users' =\u003e ['users', 'branch_id', 'id'],\r\n  'users.orders' =\u003e ['orders', 'user_id', 'id'],\r\n]);\r\n```\r\n\r\nContoh skema relasi:\r\n\r\n* `branches` memiliki banyak `users`\r\nHasil akan memiliki struktur nested seperti:\r\n\r\n```php\r\n[\r\n  {\r\n    id: 1,\r\n    name: 'Branch A',\r\n    users: [\r\n      { id: 10, name: 'User A', orders: [\r\n          { id: 1001, total: 50000 },\r\n          { id: 1002, total: 30000 },\r\n        ]\r\n      },\r\n      ...\r\n    ]\r\n  },\r\n  ...\r\n]\r\n```\r\n\r\n* `users` memiliki banyak `orders`\r\n```php\r\n$this-\u003eGeneralModel-\u003etabel('branches')-\u003ewithDeepNestedMany([\r\n  'users' =\u003e ['users', 'branch_id', 'id'],\r\n  'users.roles' =\u003e ['roles', 'user_id', 'id'],\r\n]);\r\n````\r\n\r\nHasil akan memiliki struktur nested seperti:\r\n\r\n```php\r\n[\r\n  {\r\n    id: 1,\r\n    name: 'Branch A',\r\n    users: [\r\n      { id: 10, name: 'User A', roles: [ ... ] },\r\n      ...\r\n    ]\r\n  },\r\n  ...\r\n]\r\n```\r\n\r\n---\r\n\r\n### 2. transaction(callable \\$callback)\r\n\r\n**Membungkus banyak query dalam transaksi database otomatis.**\r\n\r\n```php\r\n$this-\u003eGeneralModel-\u003etransaction(function($model) {\r\n  $model-\u003etabel('users')-\u003einsert([...]);\r\n  $model-\u003etabel('logs')-\u003einsert([...]);\r\n});\r\n```\r\n\r\nAkan rollback jika terjadi error/exception.\r\n\r\n---\r\n\r\n### 3. increment() dan decrement()\r\n\r\n**Update numerik langsung di query tanpa select terlebih dahulu.**\r\n\r\n```php\r\n$this-\u003eGeneralModel-\u003etabel('products')-\u003ewhere('id', 5)-\u003eincrement('stock', 10);\r\n$this-\u003eGeneralModel-\u003etabel('products')-\u003ewhere('id', 5)-\u003edecrement('stock', 3);\r\n```\r\n\r\n---\r\n\r\n### 4. upsertMany()\r\n\r\n**Insert banyak data sekaligus dengan dukungan `ON DUPLICATE KEY UPDATE`.**\r\n\r\n```php\r\n$this-\u003eGeneralModel-\u003etabel('users')-\u003eupsertMany([\r\n  ['id' =\u003e 1, 'name' =\u003e 'A'],\r\n  ['id' =\u003e 2, 'name' =\u003e 'B']\r\n], ['id']);\r\n```\r\n\r\nJika `id` sudah ada → data akan di-*update*, bukan insert baru.\r\n\r\n---\r\n\r\n### 5. Integrasi dengan DataTables Server-Side\r\n\r\n**Buat query untuk kebutuhan DataTables otomatis dari request frontend.**\r\n\r\n--BackEnd\r\n```php\r\npublic function datatables()\r\n{\r\n    $post = $this-\u003einput-\u003epost();\r\n    $keyword = $post['search']['value'] ?? '';\r\n    $start   = (int) $post['start'];\r\n    $length  = (int) $post['length'];\r\n    $order   = $post['order'][0] ?? ['column' =\u003e 0, 'dir' =\u003e 'asc'];\r\n    $columns = $post['columns'];\r\n    $orderCol = $columns[$order['column']]['data'];\r\n\r\n    $this-\u003eload-\u003emodel('GeneralModel');\r\n\r\n    $model = $this-\u003eGeneralModel-\u003etabel('users')\r\n        -\u003eselect('id, name, email, role')\r\n        -\u003elike_group(['name', 'email', 'role'], $keyword)\r\n        -\u003eorder_by($orderCol, $order['dir']);\r\n\r\n    $data  = $model-\u003elimit($length, $start)-\u003eget();\r\n    $total = $this-\u003eGeneralModel-\u003etabel('users')\r\n        -\u003elike_group(['name', 'email', 'role'], $keyword)\r\n        -\u003ecount();\r\n\r\n    echo json_encode([\r\n        'draw'            =\u003e intval($post['draw']),\r\n        'recordsTotal'    =\u003e $total,\r\n        'recordsFiltered' =\u003e $total,\r\n        'data'            =\u003e $data,\r\n    ]);\r\n}\r\n```\r\n\r\n--Frontend JavaScript Jquery Datatables\r\n```js\r\n$('#userTable').DataTable({\r\n  processing: true,\r\n  serverSide: true,\r\n  ajax: {\r\n    url: '/user/datatables',\r\n    type: 'POST'\r\n  },\r\n  columns: [\r\n    { data: 'id' },\r\n    { data: 'name' },\r\n    { data: 'email' },\r\n    { data: 'role' }\r\n  ]\r\n});\r\n```\r\n---\r\n\r\n### 6. Soft Delete, Restore, Force Delete\r\n\r\n**Menandai data sebagai terhapus tanpa benar-benar menghapus dari database.**\r\n\r\n```php\r\n$this-\u003eGeneralModel-\u003etabel('users')-\u003ewhere('id', 1)-\u003esoftDelete();\r\n$this-\u003eGeneralModel-\u003etabel('users')-\u003ewithTrashed()-\u003eget();\r\n$this-\u003eGeneralModel-\u003etabel('users')-\u003eonlyTrashed()-\u003erestore();\r\n$this-\u003eGeneralModel-\u003etabel('users')-\u003eonlyTrashed()-\u003eforceDelete();\r\n```\r\n\r\n---\r\n\r\n### 7. Auto Caching Query\r\n\r\n**Simpan hasil query ke cache untuk menghemat load database.**\r\n\r\n```php\r\n$data = $this-\u003eGeneralModel-\u003etabel('branches')-\u003eremember(300)-\u003eget(); // cache 5 menit\r\n$this-\u003eGeneralModel-\u003ecacheForget('branches'); // hapus cache secara manual\r\n```\r\n\r\n---\r\n\r\n## 🔗 Contoh Relasi Manual (One to Many)\r\n\r\nKamu juga bisa membangun relasi manual satu ke banyak (1-n) secara eksplisit:\r\n\r\n```php\r\n// Ambil semua branch\r\n$branches = $this-\u003eGeneralModel-\u003etabel('branches')-\u003eget();\r\n$branchIds = array_column($branches, 'id');\r\n\r\n// Ambil user berdasarkan branch\r\n$users = $this-\u003eGeneralModel-\u003etabel('users')-\u003ewhereIn('branch_id', $branchIds)-\u003eget();\r\n\r\n// Gabungkan secara manual\r\nforeach ($branches as \u0026$branch) {\r\n  $branch['users'] = array_values(array_filter($users, function($u) use ($branch) {\r\n    return $u['branch_id'] == $branch['id'];\r\n  }));\r\n}\r\n```\r\n\r\nGunakan pendekatan ini jika tidak ingin memakai `withDeepNestedMany()`.\r\n\r\n---\r\n\r\n## 🛠 Cara Pakai Dasar\r\n\r\n### Select data\r\n\r\n```php\r\n$data = $this-\u003eGeneralModel-\u003etabel('users')-\u003ewhere('role', 'admin')-\u003eget();\r\n```\r\n\r\n### Ambil satu data saja\r\n\r\n```php\r\n$data = $this-\u003eGeneralModel-\u003etabel('users')-\u003ewhere('id', 1)-\u003efirst();\r\n```\r\n\r\n### Insert data\r\n\r\n```php\r\n$this-\u003eGeneralModel-\u003etabel('users')-\u003einsert([\r\n  'name' =\u003e 'John',\r\n  'email' =\u003e 'john@example.com'\r\n]);\r\n```\r\n\r\n### Update data\r\n\r\n```php\r\n$this-\u003eGeneralModel-\u003etabel('users')-\u003ewhere('id', 1)-\u003eupdate([\r\n  'email' =\u003e 'new@example.com'\r\n]);\r\n```\r\n\r\n### Delete data\r\n\r\n```php\r\n$this-\u003eGeneralModel-\u003etabel('users')-\u003ewhere('id', 1)-\u003edelete();\r\n```\r\n\r\n---\r\n\r\n## 📌 Catatan Tambahan\r\n\r\n* Gunakan `-\u003edebug()` di akhir query chain untuk mencetak SQL dan value-nya.\r\n* Semua fungsi `where`, `orWhere`, `orLike`, `groupBy`, `having`, `likeGroup`, `whereIn`, `orHaving`, dsb tersedia.\r\n* Auto-pagination tersedia via `-\u003epaginate($page, $perPage)`.\r\n* Fungsi agregat: `count()`, `sum()`, `avg()` juga didukung.\r\n\r\n---\r\n\r\n## 📂 Struktur Rekomendasi CI3\r\n\r\n* lokasi model: `application/models/GeneralModel.php`\r\n* Load otomatis via `application/config/autoload.php`.\r\n```php\r\n$autoload['model'] = array('GeneralModel');\r\n```\r\n* Load secara manual di controller:\r\n```php\r\n$this-\u003eload-\u003emodel('GeneralModel'); //untuk load manual\r\n```\r\n* tips penggunaan simple\r\n```php\r\n$DB = $this-\u003eGeneralModel;\r\n$DB-\u003etabel('users')\r\n-\u003ewhere('id', 1)\r\n-\u003eupdate([\r\n  'email' =\u003e 'new@example.com'\r\n]);\r\n```\r\n---\r\n## Saran Gunakan CI3 yang Sudah Di-patch untuk PHP 8\r\nKamu bisa pakai:\r\n🔗 [https://github.com/codeigniter-id/CodeIgniter-3.1.13.](https://codeigniter.com/userguide3/installation/downloads.html)\r\natau fork resmi yang diperbarui komunitas, misal: [kenjis/ci3-to-4-upgrade-helper](https://github.com/kenjis/ci3-to-4-upgrade-helper)\r\n\r\n![CI3](https://img.shields.io/badge/framework-CodeIgniter3-red)\r\n\r\nMaintained by: **@awenk**\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbadueny%2Fci3-model-builder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbadueny%2Fci3-model-builder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbadueny%2Fci3-model-builder/lists"}