Agile Data
Le gusta 3
Data Access Framework for high-latency databases (Cloud SQL/NoSQL).
Name | Agile Data |
---|---|
Sitio web | 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 | Sí https://github.com/atk4/schema |
Can be used in Any Framework | Sí Through composer/packagist |
Automated Cache | Sí 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 Calificaciones |
Enterprise Compliance | 5.0/5 2 Calificaciones |
Minimum PHP Version | 5.6 |
Basic Features | |
PDO Support | Sí Yes |
Transparent support for NoSQL | - Through 3rd party drivers. |
How to invoke db-vendor-specific extensions? | Sí For SQL - save/load/delete operations are expressed in DSQL Queries that can be manipulated: http://git.io/dsql |
Array as a persistence | Sí CRUD operations supported |
RestAPI as a persistence | - Through 3rd party extension. |
JSON string as a persistence | Sí Supported with few extra lines of code. |
Same model, multiple persistences | Sí Same class. Different object. |
Basic Single-record operations (C,R,U,D) | |
Table Name Mapping | Sí Yes |
Field Name Mapping | Sí Yes (Field::actual property) |
Map Entity to SubQuery | Sí Yes. Extension exist for UNION-models. https://github.com/atk4/report |
Map property to expression | Sí $model->addExpression() |
Map native types (DateTime) | Sí $field->type = 'date' |
User-defined types (e.g. "23 USD") | Sí Yes. Independent from Model. by extending Field class. |
Map field of related Entity ('currency' = currency_id->Model Currency.name) | Sí Transparently maps into sub-select. |
Map field to sub-query on related entity (Client.balance = Client->orders->sum(total)) | Sí Yes. hasMany()->addField(..aggregate) |
Entity to join multiple tables (adding new record populates both tables) | Sí $model->join('other_table') |
Criteria, Scope, Conditions (Model will refuse to work with records that does not match criteria) | |
Support model-level criteria | Sí Yes. Applied on loading / saving / update. |
Soft-delete | Sí Through criteria. Example given in the docs. |
Domain Model Criteria | Sí $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 | Sí $m->addCondition($m->expr('..')); |
Criteria Compliance (new record must match condition) | Sí Transaction rollback and exception. Automated-rloading. |
Dynamic criteria | Sí $user->addCondition('is_expired', false) |
Query Building (Convert Model into Query object for further SQL tweaking) | |
Convert Model into Query Object | Sí $q = $model->action('select'); |
Raw expression | Sí new Expression('any sql') |
Nested/Composite Queries/Expressions | Sí Expression can be in any part of query |
Reference domain-model field in query | Sí through Expressionable interface |
field, where, order, limit | Sí Expressions and Parametric values |
options, rollup, partition | - Through custom templates, or expressions. |
UPDATE, DELETE, INSERT query building | Sí |
REPLACE, TRUNCATE | Sí |
SHOW, DESCRIBE, CALL | - Supported through Expressions or Custom query template |
ALTER, CREATE query building | Sí Addon: http://github.com/atk4/schema |
User-defined query template | Sí Templates for all queries |
full support for OR conditions | Sí 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) | Sí |
Associative Array (id=>value) | No Planned |
Select only required fields | Sí |
Typecasting (e.g. DateTime) | Sí |
Import (multiple records) | Sí |
Respect domain model mapping (and criteria) | Sí |
Single row | Sí loadAny |
Single Value | Sí Through action |
Single Column | - may need to map resulting array |
Iterator | Sí |
Bypass persistence mapping | Sí action('select')->getAll() |
Loading and Saving individual records | |
Load by ID | Sí load(id) |
Load by other field | Sí loadBy('field', $value) |
Read-only Models | Sí Yes |
Model without primary key | Sí Yes, but only in Read-only Mode |
Specify fields to load | Sí onlyFields() |
Save only sends dirty fields | Sí |
Guarded / Fillable properties | Sí Conditions and OnlyFields do same thing but more reliably. |
Object Hierarchy Model | |
Admin extends User, adds criteria (is_admin=1) | Sí Yes, recommended pattern. "User" class adds condition. |
Admin extends User, adds accessible fields | Sí Yes, recommended pattern. |
Extend model, add Join (Disjoined SubTypes) | Sí Yes. Unlimited number of joins. |
Extend model change table | Sí 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 | Sí References are implemented as Objects |
One-to-Many | Sí $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 | Sí $order->hasOne('user_id', new User()); |
Many-to-Many | Sí $user->addCondition('vip', true)->ref('Orders'); |
Deep Many-to-Many traversal. | Sí $user->ref('Orders')->ref('Payments')->action('count'); No intermediate queries. |
Cross-Persistence traversal | Sí $user->hasMany('Log', new Log($mongodb)); |
Cross-persistence joins, aggregation, reporting | |
Multi-persistence join | No |
UNION existing models | Sí Yes, in add-on https://github.com/atk4/report/. Can join UNION result with more tables. |
Domain-model Aggregation | Sí Group by multiple fields. Apply aggregation functions. Preserve types. |
Model to Model join | No Planned. |
Multi-persistence UNION | No |
Behaviours / Hooks | |
Before/After operation | Sí |
Override standard C,R,U,D operations | Sí |
Persistence-specific hooks (to modify Query) | Sí |
User-defined hooks | Sí |
Auditing | |
Global Auditing | Sí http://www.agiletoolkit.org/data/extensions/audit |
Store old/new field values | Sí Yes in JSON and user-readable string. |
Revert action (undo) and replay (redo) | Sí |
Reactive actions | Sí Each action will be automatically linked with sub-actions which may be invoked through Hooks. |
Store log in any persistence | Sí |
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 | Sí |
Access to record-specific history | Sí $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 | Sí CRUD, Form, Table, Grid, Entity-manager. (see https://github.com/atk4/ad) |
API extensions | Sí 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.