Agile Data
Likes 3
Data Access Framework for high-latency databases (Cloud SQL/NoSQL).
Name  | Agile Data | 
|---|---|
| Website | git.io/ad | 
| Github / Bitbucket / Sourceforge | git.io/ad | 
| License | MIT | 
| Latest version | 1.2.x | 
| How schema is defined? | in PHP. Method init() in Model class defines fields, relations, conditions, etc. | 
| Code generation | Yes https://github.com/atk4/schema | 
| Can be used in Any Framework | Yes Through composer/packagist | 
| Automated Cache | Yes Frameworks focuses on optimizing queries rather then caching. Still possible with cross-persistence saving. | 
| Anti-patterns (purposely included) | Model close-coupled with Persistence and Field classes. | 
| Audience | |
| Dependencies | Minimal: 2 packages: DSQL Query Builder (git.io/... | 
| Simplicity | 5.0/5 2 ratings  | 
| Enterprise Compliance | 5.0/5 2 ratings  | 
| Minimum PHP Version | 5.6 | 
| Basic Features | |
| PDO Support | Yes Yes | 
| Transparent support for NoSQL | - Through 3rd party drivers. | 
| How to invoke db-vendor-specific extensions? | Yes For SQL - save/load/delete operations are expressed in DSQL Queries that can be manipulated: http://git.io/dsql | 
| Array as a persistence | Yes CRUD operations supported | 
| RestAPI as a persistence | - Through 3rd party extension. | 
| JSON string as a persistence | Yes Supported with few extra lines of code. | 
| Same model, multiple persistences | Yes Same class. Different object. | 
| Basic Single-record operations (C,R,U,D) | |
| Table Name Mapping | Yes Yes | 
| Field Name Mapping | Yes Yes (Field::actual property) | 
| Map Entity to SubQuery | Yes Yes. Extension exist for UNION-models. https://github.com/atk4/report | 
| Map property to expression | Yes $model->addExpression() | 
| Map native types (DateTime) | Yes $field->type = 'date' | 
| User-defined types (e.g. "23 USD") | Yes Yes. Independent from Model. by extending Field class. | 
| Map field of related Entity ('currency' = currency_id->Model Currency.name) | Yes Transparently maps into sub-select. | 
| Map field to sub-query on related entity (Client.balance = Client->orders->sum(total)) | Yes Yes. hasMany()->addField(..aggregate) | 
| Entity to join multiple tables (adding new record populates both tables) | Yes $model->join('other_table') | 
| Criteria, Scope, Conditions (Model will refuse to work with records that does not match criteria) | |
| Support model-level criteria | Yes Yes. Applied on loading / saving / update. | 
| Soft-delete | Yes Through criteria. Example given in the docs. | 
| Domain Model Criteria | Yes $m->addCondition('gender','M'); where 'gender' can be arbitrary expression, sub-select, field from association(join) or mapped no another physical field. | 
| Expression-based condition | Yes $m->addCondition($m->expr('..')); | 
| Criteria Compliance (new record must match condition) | Yes Transaction rollback and exception. Automated-rloading. | 
| Dynamic criteria | Yes $user->addCondition('is_expired', false) | 
| Query Building (Convert Model into Query object for further SQL tweaking) | |
| Convert Model into Query Object | Yes $q = $model->action('select'); | 
| Raw expression | Yes new Expression('any sql') | 
| Nested/Composite Queries/Expressions | Yes Expression can be in any part of query | 
| Reference domain-model field in query | Yes through Expressionable interface | 
| field, where, order, limit | Yes Expressions and Parametric values | 
| options, rollup, partition | - Through custom templates, or expressions. | 
| UPDATE, DELETE, INSERT query building | Yes | 
| REPLACE, TRUNCATE | Yes | 
| SHOW, DESCRIBE, CALL | - Supported through Expressions or Custom query template | 
| ALTER, CREATE query building | Yes Addon: http://github.com/atk4/schema | 
| User-defined query template | Yes Templates for all queries | 
| full support for OR conditions | Yes Through Object Composition and Expressions | 
| Use Domain logic in multi-record update | - Supported, but must map fields/values manually. | 
| Data Fetching (different ways to retrieve data from database) | |
| Get All Data (2x array) | Yes | 
| Associative Array (id=>value) | No Planned | 
| Select only required fields | Yes | 
| Typecasting (e.g. DateTime) | Yes | 
| Import (multiple records) | Yes | 
| Respect domain model mapping (and criteria) | Yes | 
| Single row | Yes loadAny | 
| Single Value | Yes Through action | 
| Single Column | - may need to map resulting array | 
| Iterator | Yes | 
| Bypass persistence mapping | Yes action('select')->getAll() | 
| Loading and Saving individual records | |
| Load by ID | Yes load(id) | 
| Load by other field | Yes loadBy('field', $value) | 
| Read-only Models | Yes Yes | 
| Model without primary key | Yes Yes, but only in Read-only Mode | 
| Specify fields to load | Yes onlyFields() | 
| Save only sends dirty fields | Yes | 
| Guarded / Fillable properties | Yes Conditions and OnlyFields do same thing but more reliably. | 
| Object Hierarchy Model | |
| Admin extends User, adds criteria (is_admin=1) | Yes Yes, recommended pattern. "User" class adds condition. | 
| Admin extends User, adds accessible fields | Yes Yes, recommended pattern. | 
| Extend model, add Join (Disjoined SubTypes) | Yes Yes. Unlimited number of joins. | 
| Extend model change table | Yes Yes. Used to tweak 3rd party models. | 
| Relations/References (One model can relate to another model. NOT A TABLE JOIN) | |
| Model can define relation to other Model | Yes References are implemented as Objects | 
| One-to-Many | Yes $user->hasMany('Orders', new Order()); | 
| One-to-many traversal strategy | Returns destination model instance with dynamically applied criteria (parent_id=123). No queries are executed. Inserting record into this model will ensure association with parent model. | 
| Lazy/Eager-loading | No Anti-pattern | 
| One-to-One | Yes $order->hasOne('user_id', new User()); | 
| Many-to-Many | Yes $user->addCondition('vip', true)->ref('Orders'); | 
| Deep Many-to-Many traversal. | Yes $user->ref('Orders')->ref('Payments')->action('count'); No intermediate queries. | 
| Cross-Persistence traversal | Yes $user->hasMany('Log', new Log($mongodb)); | 
| Cross-persistence joins, aggregation, reporting | |
| Multi-persistence join | No | 
| UNION existing models | Yes Yes, in add-on https://github.com/atk4/report/. Can join UNION result with more tables. | 
| Domain-model Aggregation | Yes Group by multiple fields. Apply aggregation functions. Preserve types. | 
| Model to Model join | No Planned. | 
| Multi-persistence UNION | No | 
| Behaviours / Hooks | |
| Before/After operation | Yes | 
| Override standard C,R,U,D operations | Yes | 
| Persistence-specific hooks (to modify Query) | Yes | 
| User-defined hooks | Yes | 
| Auditing | |
| Global Auditing | Yes http://www.agiletoolkit.org/data/extensions/audit | 
| Store old/new field values | Yes Yes in JSON and user-readable string. | 
| Revert action (undo) and replay (redo) | Yes | 
| Reactive actions | Yes Each action will be automatically linked with sub-actions which may be invoked through Hooks. | 
| Store log in any persistence | Yes | 
| Override, Add fields to audit log | Record dirty fields before persisting. Type-cast into JSON string and store in a single field of AuditLog Model. This model can be persisted anywhere, table, file, etc. | 
| Custom events | Yes | 
| Access to record-specific history | Yes $item->ref('AuditLog'); | 
| Date of creation, modification | - No but easy to add through hook. | 
| User/IP creation, modification | - Easy to add through a hook. | 
| Store incremental revisions | - Easy to add through a hook | 
| Integration | |
| Field meta-information provided | Type, caption, possible values, mapped field, join table spec, encryption, serialization, UI-specific settings, validation rules. | 
| UI extensions | Yes CRUD, Form, Table, Grid, Entity-manager. (see https://github.com/atk4/ad) | 
| API extensions | Yes RestFULL API, automated CRUD operations + RPC https://github.com/atk4/api | 
User reviews and comments
Couldn't work on any other framework/orm after switching to ATK. Its just how every programmer always wanted ...
Using in Recent modules of our ERP
Most simple among what I used (almost all popular ones)
Not really an ORM, but offers much more powerful support for Domain Model.