Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
19a75a2
feat: add unique on multiple column
abdul-kaioum Feb 16, 2025
d513b15
fix: remove trailing comma
abdul-kaioum Feb 16, 2025
4a4bd17
feat: orderby raw query
abdul-kaioum Feb 16, 2025
d49944e
chore: removed order direction from orderByRaw
abdul-kaioum Feb 17, 2025
92437df
fix: binding is not reseting after executing a query, causes mismatch…
abdul-kaioum Feb 18, 2025
6aae61d
reafctor: querybuilder
abdul-kaioum Feb 20, 2025
1693881
wip: with aggregate function
abdul-kaioum Feb 27, 2025
43fb931
feat: bool cast, withCast
anisurov Feb 28, 2025
ae071ad
fix: update function
anisurov Feb 28, 2025
300b963
feat: relational subselect for aggregate
anisurov Feb 28, 2025
07930df
feat: model event
abdul-kaioum Mar 3, 2025
2ee3099
fix: prepared query is wrong, it is prepareing through wrong method
abdul-kaioum Mar 5, 2025
d54ba7a
fix: raw query result issue
abdul-kaioum Mar 5, 2025
43e4aeb
fix: trim query to match
abdul-kaioum Mar 5, 2025
b550e99
fix: event not triggering
abdul-kaioum Mar 6, 2025
27fd9b0
fix: prevent delete statement if where clause is null to avoid unwant…
abdul-kaioum Mar 6, 2025
4986f02
fix: change condition to check empty string which is not null
abdul-kaioum Mar 6, 2025
8410502
fix: model save event
abdul-kaioum Mar 11, 2025
3092cb3
feat: added some aggregate relation functions
abdul-kaioum Mar 11, 2025
c3eb318
fix: event in loop issue due static prop
abdul-kaioum Mar 12, 2025
c8bff11
fix: reseting select due to count query
abdul-kaioum Mar 12, 2025
ac312e2
feat: added bindings for selectRaw
abdul-kaioum Mar 12, 2025
dc96df5
fix: count query
abdul-kaioum Mar 12, 2025
6634704
fix: min, max query
abdul-kaioum Mar 12, 2025
ac03930
fix: add qoute to col name in condition
abdul-kaioum Mar 12, 2025
2dcdb36
chore: Prevent query execution if pre-query event returns false
abdul-kaioum Mar 13, 2025
26404d7
fix: aggregate functions
abdul-kaioum Mar 15, 2025
229cfae
fix: mismatch binding in closure query
abdul-kaioum Mar 16, 2025
d6f9d54
fix: bulk insert is not returning all inserted model
abdul-kaioum Apr 22, 2025
bd7fc72
fix: bulk insert is not returning all inserted model due not consider…
abdul-kaioum Apr 22, 2025
3101158
feat: set timezone statically
abdul-kaioum Apr 29, 2025
17ec2ab
feat: upsert record on duplicate
abdul-kaioum May 3, 2025
1f93af4
feat: collection
abdul-kaioum May 3, 2025
d747d83
fix: should return empty array when result is empty but returns Colle…
abdul-kaioum May 7, 2025
1d9622a
fix: raw select not returning result
abdul-kaioum Jul 14, 2025
b7c8083
refacor: transactions method added in Connection and deprecated in QB
abdul-kaioum Aug 14, 2025
18a5660
refactor: make relation query methods statically accessible on Model
abdul-kaioum Jun 28, 2026
0e8bb99
docs: add comprehensive usage guide
abdul-kaioum Jun 28, 2026
169539b
Chore: php-cs-fixer to export-ignore
abdul-kaioum Jun 28, 2026
3946aed
test: add failing tests pinning relation/event/aggregate defects
abdul-kaioum Jun 29, 2026
a5d0d6d
fix: relation aggregates, soft delete, events and zero-collapse
abdul-kaioum Jun 29, 2026
9da5921
fix: use 7.4-compatible nullable types
abdul-kaioum Jun 29, 2026
8064f20
refactor: move internal traits into Concerns namespace
abdul-kaioum Jun 29, 2026
3394839
refactor: extract SELECT compilation into Query\Grammar
abdul-kaioum Jun 29, 2026
edfa9bb
refactor: tighten Grammar surface and drop dead getters
abdul-kaioum Jun 29, 2026
c3ea480
test: cover joins, subqueries, when(), constrained eager load and update
abdul-kaioum Jun 29, 2026
3777101
fix: correct LIKE operator check in Grammar
abdul-kaioum Jun 29, 2026
c9e95d8
fix: address Gemini review findings (upsert, casts, pluck, withCast)
abdul-kaioum Jun 29, 2026
d35cd2a
docs: count() int return, boolean cast, internal namespace move
abdul-kaioum Jun 29, 2026
97e5d1d
docs: rewrite README as quick-start + doc index
abdul-kaioum Jun 29, 2026
393c39e
docs(usage): audience note, accurate setup + model properties
abdul-kaioum Jun 29, 2026
77fc7c7
docs(usage): correct CRUD return types, soft-delete + upsert caveats
abdul-kaioum Jun 29, 2026
01e1b7b
docs(usage): query builder — count int, LIKE, join caveat, paginate s…
abdul-kaioum Jun 29, 2026
48de688
docs(usage): verify collection methods + cast types, fix cast timing
abdul-kaioum Jun 29, 2026
dc93c3e
docs(usage): correct belongsTo/hasOne semantics + relation aggregates
abdul-kaioum Jun 29, 2026
bbfb6e0
docs(usage): events (drop creating/created), schema teaser, Limitatio…
abdul-kaioum Jun 29, 2026
5788723
docs: add schema builder reference (docs/schema.md)
abdul-kaioum Jun 29, 2026
5c0b27f
docs(breaking-changes): fix find() return + event list accuracy
abdul-kaioum Jun 29, 2026
1d04dea
docs: correct schema prefix/change()/direct-drop claims to match source
abdul-kaioum Jun 29, 2026
cac1b1d
docs(schema): remove residual auto-prefix claims (FK ref, rename, wit…
abdul-kaioum Jun 29, 2026
ed3c82d
chore: gitignore .superpowers/ scratch dir
abdul-kaioum Jun 29, 2026
3041ef1
fix: change() emits MODIFY COLUMN, not ADD COLUMN CHANGE COLUMN
abdul-kaioum Jun 30, 2026
9184539
fix: direct-call schema drop helpers emit full SQL
abdul-kaioum Jun 30, 2026
b37aaa7
feat: subscribable creating/created model events
abdul-kaioum Jun 30, 2026
9bceb0f
fix: bulk insert always returns a Collection
abdul-kaioum Jun 30, 2026
3e5db3a
fix: joins no longer double-prefix and qualify ON column
abdul-kaioum Jun 30, 2026
0e4b29a
feat: add Schema::withWpPrefix() opt-in for WP-prefixed tables
abdul-kaioum Jun 30, 2026
ea54365
feat: opt-in soft-delete read scope with withTrashed/onlyTrashed
abdul-kaioum Jun 30, 2026
e78915e
fix: parenthesize user WHERE when injecting soft-delete scope
abdul-kaioum Jun 30, 2026
9677449
fix: upsert manages updated_at; reorganise review-fix tests
abdul-kaioum Jun 30, 2026
3cac80c
feat: add pivot-table many-to-many to belongsToMany (read-side)
abdul-kaioum Jun 30, 2026
d7b28a3
fix: join and pivot tables keep wp_ prefix for custom-$prefix models
abdul-kaioum Jun 30, 2026
7aa24f2
fix: bulk insert and upsert JSON-encode array/object values
abdul-kaioum Jun 30, 2026
8b21d24
docs: document JSON-encoded insert/upsert values and getTablePrefix j…
abdul-kaioum Jun 30, 2026
a43e80e
fix: select() handles `column AS alias` without back-ticking the alias
abdul-kaioum Jun 30, 2026
08b8384
fix: eager-load key subquery ignores parent selectRaw
abdul-kaioum Jun 30, 2026
acc3652
fix: drop ORDER BY from eager-load key subquery (keep when LIMIT-bound)
abdul-kaioum Jun 30, 2026
234c805
test: edge-case characterization for where/select/join/aggregate/rela…
abdul-kaioum Jun 30, 2026
42ba9b9
fix: repair insert/where/aggregate/soft-delete edge cases (zero-BC Ph…
abdul-kaioum Jun 30, 2026
018290c
docs: forceDelete/restore + Phase 1 invalid-SQL repair notes
abdul-kaioum Jun 30, 2026
3810f3b
fix: order/group injection guard, cast aliases, relation-dirty, ragge…
abdul-kaioum Jun 30, 2026
c710ad0
docs: Phase 2 behavioral notes (order/group validation, cast aliases,…
abdul-kaioum Jun 30, 2026
65fff45
fix: eager empty relation resolves to [] without an N+1 re-query (C3)
abdul-kaioum Jun 30, 2026
ede27bb
fix: soft-delete reads exclude trashed rows by default
abdul-kaioum Jul 1, 2026
02ab558
docs: add relations reference; soft-delete default-filter notes
abdul-kaioum Jul 1, 2026
6b61445
test: add RED relation-resolution safety tests (impl pending)
abdul-kaioum Jul 1, 2026
51db655
fix: reject non-relation names in with/withCount/whereHas (option alpha)
abdul-kaioum Jul 1, 2026
cf1055f
docs: note non-obvious v2.0 migration gotchas (from bit-pi audit)
abdul-kaioum Jul 1, 2026
a37a885
fix: save() treats a 0-row UPDATE as success, not failure
abdul-kaioum Jul 1, 2026
273fe83
fix: save() insert decides success from exec(), keeps lastInsertId()
abdul-kaioum Jul 1, 2026
4292e15
test: cover session-change edge cases; fix null-offset deprecation
abdul-kaioum Jul 1, 2026
21c4fd6
test: close remaining coverage gaps (memoization, base-class relation…
abdul-kaioum Jul 1, 2026
6d8b1d3
build: require PHP >=8.2, add phpunit dev-dep + composer test
abdul-kaioum Jul 1, 2026
9ad27f8
feat: add distinct() to query builder
abdul-kaioum Jul 2, 2026
686b0b4
feat: add avg()/sum(); validate aggregate function name
abdul-kaioum Jul 2, 2026
b4c49ef
fix: resolve unprefixed model/join table names in qualified columns
abdul-kaioum Jul 2, 2026
39d5b60
fix: address review findings on the query-builder fixes
abdul-kaioum Jul 2, 2026
d9ac687
docs: document distinct(), avg()/sum(), and qualified-column resolution
abdul-kaioum Jul 2, 2026
d6a642c
refactor: simplify qualifier helpers
abdul-kaioum Jul 2, 2026
39de225
fix: robust join alias split and ON constant operands
abdul-kaioum Jul 4, 2026
1141376
chore: exclude tests and test config from dist archive
abdul-kaioum Jul 4, 2026
0bff4a4
chore: exclude docs from dist archive
abdul-kaioum Jul 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,10 @@

/.vscode export-ignore
lefthook.yml export-ignore
.php-cs-fixer.php export-ignore
.gitattributes export-ignore
.gitignore export-ignore
.gitignore export-ignore
/tests export-ignore
/docs export-ignore
phpunit.xml export-ignore
phpcs.xml export-ignore
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,7 @@ vendor/
.php-cs-fixer.cache
tests.config.php
.phpunit.result.cache
.phpunit.cache/
phpunit.phar
composer.lock
.superpowers/
51 changes: 39 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,49 @@
### WPKit/Database
# wp-database

---
A small ActiveRecord ORM with a fluent query and schema builder on top of
WordPress' `$wpdb`.

# usage
## Install

1. Add this repository in composer.json
```jsonc
// composer.json
"repositories": [
{ "type": "vcs", "url": "https://github.com/Bit-Apps-Pro/wp-database" }
]
```

```bash
composer require bitapps/wp-database:dev-main
```
"repositories": [

## Quick start

```php
use BitApps\WPDatabase\Model;

class Contact extends Model
{
protected $fillable = ['name', 'email'];

public function deals()
{
"type": "vcs",
"url": "https://github.com/Bit-Apps-Pro/wp-database"
return $this->hasMany(Deal::class, 'contact_id', 'id');
}
]
```
}

2. Then install the package
Contact::insert(['name' => 'Ada', 'email' => 'ada@x.com']);

$active = Contact::where('is_active', 1)
->withCount('deals')
->orderBy('name')->asc()
->get(); // Collection of Contact models
```
composer require bitapps/wp-database:dev-main
```

## Documentation

- **[Usage guide](docs/usage.md)** — models, query builder, relationships,
casts, events, transactions, and more.
- **[Relationships](docs/relations.md)** — `hasOne`/`belongsTo`/`hasMany`/`belongsToMany`,
eager & lazy loading, relation aggregates, and limitations.
- **[Schema builder](docs/schema.md)** — table creation, columns, indexes, and migrations.
- **[Breaking changes](docs/breaking-changes.md)** — upgrade notes.
11 changes: 8 additions & 3 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,29 +29,34 @@
]
},
"require": {
"php": "^7.4 || ^8.0"
"php": ">=8.2"
},
"autoload": {
"psr-4": {
"BitApps\\WPDatabase\\": "./src"
}
},
"scripts": {
"test": "phpunit",
"lint": "./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.php",
"compat": "./vendor/bin/phpcs -p ./src --standard=PHPCompatibilityWP --runtime-set testVersion 7.4-"
"compat": "./vendor/bin/phpcs -p ./src --standard=PHPCompatibilityWP --runtime-set testVersion 8.2-"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.10",
"sirbrillig/phpcs-variable-analysis": "*",
"dealerdirect/phpcodesniffer-composer-installer": "^0.7",
"phpcompatibility/phpcompatibility-wp": "*"
"phpcompatibility/phpcompatibility-wp": "*",
"phpunit/phpunit": "^11.5"
},
"extra": {
"branch-alias": {
"dev-main": "1.x-dev"
}
},
"config": {
"platform": {
"php": "8.2.0"
},
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true
}
Expand Down
Loading