Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/elusivecodes/fyreorm

FyreORM is a free, open-source database ORM library for PHP.
https://github.com/elusivecodes/fyreorm

database mysql orm php

Last synced: 2 months ago
JSON representation

FyreORM is a free, open-source database ORM library for PHP.

Awesome Lists containing this project

README

        

# FyreORM

**FyreORM** is a free, open-source database ORM for *PHP*.

## Table Of Contents
- [Installation](#installation)
- [Basic Usage](#basic-usage)
- [Methods](#methods)
- [Models](#models)
- [Schema](#schema)
- [Entities](#entities)
- [Query Methods](#query-methods)
- [Relationship Methods](#relationship-methods)
- [Behavior Methods](#behavior-methods)
- [Validation](#validation)
- [Callbacks](#callbacks)
- [Queries](#queries)
- [Delete](#delete)
- [Insert](#insert)
- [Replace](#replace)
- [Select](#select)
- [Update](#update)
- [Update Batch](#update-batch)
- [Results](#results)
- [Relationships](#relationships)
- [Belongs To](#belongs-to)
- [Has Many](#has-many)
- [Has One](#has-one)
- [Many To Many](#many-to-many)
- [Behavior Registry](#behavior-registry)
- [Behaviors](#behaviors)
- [Timestamp](#timestamp)
- [Rules](#rules)

## Installation

**Using Composer**

```
composer require fyre/orm
```

In PHP:

```php
use Fyre\ORM\ModelRegistry;
```

## Basic Usage

- `$container` is a [*Container*](https://github.com/elusivecodes/FyreContainer).

```php
$modelRegistry = new ModelRegistry($container);
```

**Autoloading**

It is recommended to bind the *ModelRegistry* to the [*Container*](https://github.com/elusivecodes/FyreContainer) as a singleton.

```php
$container->singleton(ModelRegistry::class);
```

Any dependencies will be injected automatically when loading from the [*Container*](https://github.com/elusivecodes/FyreContainer).

```php
$modelRegistry = $container->use(ModelRegistry::class);
```

## Methods

**Add Namespace**

Add a namespace for loading models.

- `$namespace` is a string representing the namespace.

```php
$modelRegistry->addNamespace($namespace);
```

**Build**

Build a [*Model*](#models).

- `$classAlias` is a string representing the model class alias.

```php
$model = $modelRegistry->build($classAlias);
```

[*Model*](#models) dependencies will be resolved automatically from the [*Container*](https://github.com/elusivecodes/FyreContainer).

**Clear**

Clear all namespaces and models.

```php
$modelRegistry->clear();
```

**Create Default Model**

Create a default [*Model*](#models).

```php
$model = $modelRegistry->createDefaultModel();
```

[*Model*](#models) dependencies will be resolved automatically from the [*Container*](https://github.com/elusivecodes/FyreContainer).

**Get Default Model Class**

Get the default model class name.

```php
$defaultModelClass = $modelRegistry->getDefaultModelClass();
```

**Get Namespaces**

Get the namespaces.

```php
$namespaces = $modelRegistry->getNamespaces();
```

**Has Namespace**

Determine whether a namespace exists.

- `$namespace` is a string representing the namespace.

```php
$hasNamespace = $modelRegistry->hasNamespace($namespace);
```

**Is Loaded**

Determine whether a model is loaded.

- `$alias` is a string representing the model alias.

```php
$isLoaded = $modelRegistry->isLoaded($alias);
```

**Remove Namespace**

Remove a namespace.

- `$namespace` is a string representing the namespace.

```php
$modelRegistry->removeNamespace($namespace);
```

**Set Default Model Class**

Set the default model class name.

- `$defaultModelClass` is a string representing the default model class name.

```php
$modelRegistry->setDefaultModelClass($defaultModelClass);
```

**Unload**

Unload a model.

- `$alias` is a string representing the model alias.

```php
$modelRegistry->unload($alias);
```

**Use**

Load a shared [*Model*](#models) instance.

- `$alias` is a string representing the model alias.
- `$classAlias` is a string representing the model class alias, and will default to the model alias.

```php
$model = $modelRegistry->use($alias, $classAlias);
```

[*Model*](#models) dependencies will be resolved automatically from the [*Container*](https://github.com/elusivecodes/FyreContainer).

## Models

Custom models can be created by extending the `\Fyre\ORM\Model` class, suffixing the class name with "*Model*".

To allow autoloading an instance of your model, add the the namespace to the *ModelRegistry*.

**Delete Query**

Create a new [*DeleteQuery*](#delete).

- `$options` is an array containing options for the query.
- `alias` is a string representing the table alias, and will default to the model alias.

```php
$query = $model->deleteQuery($options);
```

**Get Connection**

Get the [*Connection*](https://github.com/elusivecodes/FyreDB#connections).

- `$type` is a string representing the connection type, and will default to `self::WRITE`.

```php
$connection = $model->getConnection($type);
```

Models use [*ConnectionManager*](https://github.com/elusivecodes/FyreDB) for database connections, and you can specify the connection to use by setting the `connectionKeys` property of your models, or using the `setConnection` method.

```php
protected array $connectionKeys = [
self::WRITE => 'default',
self::READ => 'read_replica'
];
```

If the `self::READ` key is omitted, it will fallback to the `self::WRITE` connection for database reads.

**Insert Query**

Create a new [*InsertQuery*](#insert).

```php
$query = $model->insertQuery();
```

**Replace Query**

Create a new [*ReplaceQuery*](#replace).

```php
$query = $model->replaceQuery();
```

**Select Query**

Create a new [*SelectQuery*](#select).

- `$options` is an array containing options for the query.
- `alias` is a string representing the table alias, and will default to the model alias.
- `connectionType` is a string representing the connection type, and will default to `self::READ`.
- `events` is a boolean indicating whether to trigger model/behavior events, and will default to *true*.

```php
$query = $model->selectQuery($options);
```

**Set Connection**

Set the [*Connection*](https://github.com/elusivecodes/FyreDB#connections).

- `$connection` is a [*Connection*](https://github.com/elusivecodes/FyreDB#connections).
- `$type` is a string representing the connection type, and will default to `self::WRITE`.

```php
$model->setConnection($connection, $type);
```

**Subquery**

Create a new subquery [*SelectQuery*](#select).

- `$options` is an array containing options for the query.
- `alias` is a string representing the table alias, and will default to the model alias.
- `connectionType` is a string representing the connection type, and will default to `self::READ`.

```php
$query = $model->subquery($options);
```

**Update Query**

Create a new [*UpdateQuery*](#update).

- `$options` is an array containing options for the query.
- `alias` is a string representing the table alias, and will default to the model alias.

```php
$query = $model->updateQuery($options);
```

**Update Batch Query**

Create a new [*UpdateBatchQuery*](#update-batch).

- `$options` is an array containing options for the query.
- `alias` is a string representing the table alias, and will default to the model alias.

```php
$query = $model->updateBatchQuery($options);
```

### Schema

**Alias Field**

Alias a field name.

- `$field` is a string representing the field name.
- `$alias` is a string representing the alias, and will default to the model alias.

```php
$aliasField = $model->aliasField($field, $alias);
```

**Get Alias**

Get the model alias.

```php
$alias = $model->getAlias();
```

By default, the alias will be the class alias.

**Get Auto Increment Key**

Get the table auto increment column.

```php
$autoIncrementKey = $model->getAutoIncrementKey();
```

**Get Class Alias**

Get the model class alias.

```php
$classAlias = $model->getClassAlias();
```

By default, the alias will be the class name or the alias used when loading the model with *ModelRegistry*.

**Get Display Name**

Get the display name.

```php
$displayName = $model->getDisplayName();
```

By default, the display name will be the first column in the schema with the name of either *"name"*, *"title"* or *"label"*, or you can specify a column using the `displayName` property in your models.

```php
protected string $displayName = 'display_name';
```

**Get Primary Key**

Get the primary key(s).

```php
$primaryKeys = $model->getPrimaryKey();
```

**Get Schema**

Get the [*TableSchema*](https://github.com/elusivecodes/FyreSchema#table-schemas).

```php
$tableSchema = $model->getSchema();
```

**Get Table**

Get the table name.

```php
$table = $model->getTable();
```

By default, the table name will be the snake case form of the model class alias, or you can specify a table name using the `table` property in your models.

```php
protected string $table = 'my_table';
```

**Set Alias**

Set the model alias.

- `$alias` is a string representing the model alias.

```php
$model->setAlias($alias);
```

**Set Class Alias**

Set the model class alias.

- `$classAlias` is a string representing the model class alias.

```php
$model->setClassAlias($classAlias);
```

**Set Display Name**

Set the display name.

- `$displayName` is a string representing the display name.

```php
$model->setDisplayName($displayName);
```

**Set Table**

Set the table name.

- `$table` is a string representing the table name.

```php
$model->setTable($table);
```

### Entities

Models will use the [*EntityLocator*](https://github.com/elusivecodes/FyreEntity#entity-locator) to find an entity class using the model class alias.

You can map a model alias to a specific entity class using the [*EntityLocator*](https://github.com/elusivecodes/FyreEntity#entity-locator).

```php
$entityLocator->map($alias, $className);
```

**Load Into**

Load contained data into entity.

- `$entity` is an [*Entity*](https://github.com/elusivecodes/FyreEntity).
- `$contain` is an array containing the relationships to contain.

```php
$model->loadInto($entity, $contain);
```

**New Empty Entity**

Build a new empty [*Entity*](https://github.com/elusivecodes/FyreEntity).

```php
$entity = $model->newEmptyEntity();
```

**New Entity**

Build a new [*Entity*](https://github.com/elusivecodes/FyreEntity) using data.

- `$data` is an array containing the data.
- `$options` is an array containing entity options.
- `associated` is an array containing the relationships to parse, and will default to *null*.
- `parse` is a boolean indicating whether to parse user data, and will default to *true*.
- `events` is a boolean indicating whether to trigger model/behavior events, and will default to *true*.
- `validate` is a boolean indicating whether to validate user data, and will default to *true*.
- `clean` is a boolean indicating whether to clean the entity, and will default to *false*.
- `new` is a boolean indicating whether to mark the entity as new, and will default to *null*.

```php
$entity = $model->newEntity($data, $options);
```

**New Entities**

Build multiple new entities using user data.

- `$data` is an array containing the data.
- `$options` is an array containing entity options.
- `associated` is an array containing the relationships to parse, and will default to *null*.
- `parse` is a boolean indicating whether to parse user data, and will default to *true*.
- `events` is a boolean indicating whether to trigger model/behavior events, and will default to *true*.
- `validate` is a boolean indicating whether to validate user data, and will default to *true*.
- `clean` is a boolean indicating whether to clean the entity, and will default to *false*.
- `new` is a boolean indicating whether to mark the entity as new, and will default to *null*.

```php
$entities = $model->newEntities($data, $options);
```

**Patch Entity**

Update an Entity using user data.

- `$entity` is an [*Entity*](https://github.com/elusivecodes/FyreEntity).
- `$data` is an array containing the data.
- `$options` is an array containing entity options.
- `associated` is an array containing the relationships to parse, and will default to *null*.
- `parse` is a boolean indicating whether to parse user data, and will default to *true*.
- `events` is a boolean indicating whether to trigger model/behavior events, and will default to *true*.
- `validate` is a boolean indicating whether to validate user data, and will default to *true*.
- `clean` is a boolean indicating whether to clean the entity, and will default to *false*.
- `new` is a boolean indicating whether to mark the entity as new, and will default to *null*.

```php
$model->patchEntity($entity, $data, $options);
```

**Patch Entities**

Update multiple entities using user data.

- `$entities` is an array containing the entities.
- `$data` is an array containing the data.
- `$options` is an array containing entity options.
- `associated` is an array containing the relationships to parse, and will default to *null*.
- `parse` is a boolean indicating whether to parse user data, and will default to *true*.
- `events` is a boolean indicating whether to trigger model/behavior events, and will default to *true*.
- `validate` is a boolean indicating whether to validate user data, and will default to *true*.
- `clean` is a boolean indicating whether to clean the entity, and will default to *false*.
- `new` is a boolean indicating whether to mark the entity as new, and will default to *null*.

```php
$model->patchEntities($entities, $data, $options);
```

### Query Methods

**Delete**

Delete an [*Entity*](https://github.com/elusivecodes/FyreEntity).

- `$entity` is an [*Entity*](https://github.com/elusivecodes/FyreEntity).
- `$options` is an array containing delete options.
- `events` is a boolean indicating whether to trigger model/behavior events, and will default to *true*.
- `cascade` is a boolean indicating whether to cascade deletes, and will default to *true*.

```php
$result = $model->delete($entity, $options);
```

**Delete All**

Delete all rows matching conditions.

- `$conditions` is an array or string representing the where conditions.

```php
$affectedRows = $model->deleteAll($conditions);
```

This method will not use callbacks or cascade to related data.

**Delete Many**

Delete multiple entities.

- `$entities` is an array containing the entities.
- `$options` is an array containing delete options.
- `events` is a boolean indicating whether to trigger model/behavior events, and will default to *true*.
- `cascade` is a boolean indicating whether to cascade deletes, and will default to *true*.

```php
$result = $model->deleteMany($entities, $options);
```

**Exists**

Determine whether matching rows exist.

- `$conditions` is an array or string representing the where conditions.

```php
$exists = $model->exists($conditions);
```

**Find**

Create a new [*SelectQuery*](#select).

- `$data` is an array containing the query data.
- `connectionType` is a string representing the connection type, and will default to `self::READ`.
- `fields` is an array or string representing the fields to select.
- `contain` is a string or array containing the relationships to contain.
- `join` is an array containing the tables to join.
- `conditions` is an array or string representing the where conditions.
- `orderBy` is an array or string representing the fields to order by.
- `groupBy` is an array or string representing the fields to group by.
- `having` is an array or string representing the having conditions.
- `limit` is a number indicating the query limit.
- `offset` is a number indicating the query offset.
- `epilog` is a string representing the epilog for the query.
- `autoFields` is a boolean indicating whether to enable auto fields.
- `events` is a boolean indicating whether to trigger model/behavior events, and will default to *true*.

```php
$query = $model->find($data);
```

**Get**

Retrieve a single entity.

- `$primaryValues` is a string, integer or array containing the primary key value(s).
- `$data` is an array containing the query data.
- `connectionType` is a string representing the connection type, and will default to `self::READ`.
- `fields` is an array or string representing the fields to select.
- `contain` is a string or array containing the relationships to contain.
- `join` is an array containing the tables to join.
- `epilog` is a string representing the epilog for the query.
- `autoFields` is a boolean indicating whether to enable auto fields.
- `events` is a boolean indicating whether to trigger model/behavior events, and will default to *true*.

```php
$entity = $model->get($primaryValues, $data);
```

**Save**

Save an [*Entity*](https://github.com/elusivecodes/FyreEntity).

- `$entity` is an [*Entity*](https://github.com/elusivecodes/FyreEntity).
- `$options` is an array containing save options.
- `checkExists` is a boolean indicating whether to check if new entities exist, and will default to *true*.
- `checkRules` is a boolean indicating whether to validate the [*RuleSet*](#rules), and will default to *true*.
- `saveRelated` is a boolean indicating whether to save related data, and will default to *true*.
- `saveState` is a boolean indicating whether to save the [*Entity*](https://github.com/elusivecodes/FyreEntity) before saving, and will default to *true*.
- `events` is a boolean indicating whether to trigger model/behavior events, and will default to *true*.
- `clean` is a boolean indicating whether to clean the entity after saving, and will default to *true*.

```php
$result = $model->save($entity, $options);
```

**Save Many**

Save multiple entities.

- `$entities` is an array containing the entities.
- `$options` is an array containing save options.
- `checkExists` is a boolean indicating whether to check if new entities exist, and will default to *true*.
- `checkRules` is a boolean indicating whether to validate the [*RuleSet*](#rules), and will default to *true*.
- `saveRelated` is a boolean indicating whether to save related data, and will default to *true*.
- `saveState` is a boolean indicating whether to save the [*Entity*](https://github.com/elusivecodes/FyreEntity) before saving, and will default to *true*.
- `events` is a boolean indicating whether to trigger model/behavior events, and will default to *true*.
- `clean` is a boolean indicating whether to clean the entity after saving, and will default to *true*.

```php
$result = $model->saveMany($entities, $options);
```

**Update All**

Update all rows matching conditions.

- `$data` is an array of values to update.
- `$conditions` is an array or string representing the where conditions.

```php
$affectedRows = $model->updateAll($data, $conditions);
```

This method will not use callbacks.

### Relationship Methods

**Add Relationship**

Add a [*Relationship*](#relationships).

- `$relationship` is a [*Relationship*](#relationships).

```php
$model->addRelationship($relationship);
```

**Get Relationship**

Get a [*Relationship*](#relationships).

- `$name` is a string representing the relationship name.

```php
$relationship = $model->getRelationship($name);
```

**Get Relationships**

Get all relationships.

```php
$relationships = $model->getRelationships();
```

**Has Relationship**

Determine whether a [*Relationship*](#relationships) exists.

- `$name` is a string representing the relationship name.

```php
$hasRelationship = $model->hasRelationship($name);
```

**Remove Relationship**

Remove an existing [*Relationship*](#relationships).

- `$name` is a string representing the relationship name.

```php
$model->removeRelationship($name);
```

### Behavior Methods

**Add Behavior**

Add a [*Behavior*](#behaviors) to the *Model*.

- `$name` is a string representing the behavior name.
- `$options` is an array containing behavior options.

```php
$model->addBehavior($name, $options);
```

**Get Behavior**

Get a loaded [*Behavior*](#behaviors).

- `$name` is a string representing the behavior name.

```php
$behavior = $model->getBehavior($name);
```

**Has Behavior**

Determine whether the *Model* has a [*Behavior*](#behaviors).

- `$name` is a string representing the behavior name.

```php
$hasBehavior = $model->hasBehavior($name);
```

**Remove Behavior**

Remove a [*Behavior*](#behaviors) from the *Model*.

- `$name` is a string representing the behavior name.

```php
$model->removeBehavior($name);
```

### Validation

**Get Rules**

Get the model [*RuleSet*](#rules).

```php
$rules = $model->getRules();
```

You can build custom rules by specifying a `buildRules` method in your models.

**Get Validator**

Get the model [*Validator*](https://github.com/elusivecodes/FyreValidation).

```php
$validator = $model->getValidator();
```

You can build a custom validator by specifying a `buildValidation` method in your models.

**Set Rules**

Set the model [*RuleSet*](#rules).

- `$rules` is a [*RuleSet*](#rules).

```php
$model->setRules($rules);
```

**Set Validator**

Set the model [*Validator*](https://github.com/elusivecodes/FyreValidation).

- `$validator` is a [*Validator*](https://github.com/elusivecodes/FyreValidation).

```php
$model->setValidator($validator);
```

### Callbacks

Callbacks can be defined in your models, allowing custom code to run or revert changes at various points during model operations.

**After Delete**

Execute a callback after entities are deleted.

```php
use Fyre\Entity\Entity;

public function afterDelete(Entity $entity, array $options) {}
```

If this method returns *false* the delete will not be performed and the transaction will be rolled back.

**After Delete Commit**

Execute a callback after entities are deleted and transaction is committed.

```php
use Fyre\Entity\Entity;

public function afterDeleteCommit(Entity $entity, array $options) {}
```

**After Find**

Execute a callback after performing a find query.

```php
use Fyre\ORM\Result;

public function afterFind(Result $result, array $options): Result {}
```

**After Rules**

Execute a callback after model rules are processed.

```php
use Fyre\Entity\Entity;

public function afterRules(Entity $entity, array $options) {}
```

If this method returns *false* the save will not be performed.

**After Parse**

Execute a callback after parsing user data into an entity.

```php
use Fyre\Entity\Entity;

public function afterParse(Entity $entity, array $options) {}
```

**After Save**

Execute a callback after entities are saved to the database.

```php
use Fyre\Entity\Entity;

public function afterSave(Entity $entity, array $options) {}
```

If this method returns *false* the save will not be performed and the transaction will be rolled back.

**After Save Commit**

Execute a callback after entities are saved to the database and transaction is committed.

```php
use Fyre\Entity\Entity;

public function afterSaveCommit(Entity $entity, array $options) {}
```

**Before Delete**

Execute a callback before entities are deleted.

```php
use Fyre\Entity\Entity;

public function beforeDelete(Entity $entity, array $options) {}
```

If this method returns *false* the delete will not be performed.

**Before Find**

Execute a callback before performing a find query.

```php
use Fyre\ORM\Query;

public function beforeFind(Query $query, array $options): Query {}
```

**Before Parse**

Execute a callback before parsing user data into an entity.

```php
use ArrayObject;

public function beforeParse(ArrayObject $data, array $options) {}
```

**Before Rules**

Before rules callback.

```php
use Fyre\Entity\Entity;

public function beforeRules(Entity $entity, array $options) {}
```

If this method returns *false* the save will not be performed.

**Before Save**

Execute a callback before entities are saved to the database.

```php
use Fyre\Entity\Entity;

public function beforeSave(Entity $entity, array $options) {}
```

If this method returns *false* the save will not be performed and the transaction will be rolled back.

**Initialize**

Initialize the model.

```php
$model->initialize();
```

This method is called automatically when the model is loaded. You can define this method on your custom models to attach [*relationships*](#relationships) or [*behaviors*](#behaviors).

## Queries

**Get Model**

Get the [*Model*](#models).

```php
$model = $query->getModel();
```

### Delete

The `\Fyre\ORM\Queries\DeleteQuery` class extends the [*DeleteQuery*](https://github.com/elusivecodes/FyreDB#delete) class. The table and alias will be automatically set from the *Model*.

```php
$model->deleteQuery()
->where($conditions)
->execute();
```

### Insert

The `\Fyre\ORM\Queries\InsertQuery` class extends the [*InsertQuery*](https://github.com/elusivecodes/FyreDB#insert) class. The table will be automatically set from the *Model*.

```php
$model->insertQuery()
->values($values)
->execute();
```

### Replace

The `\Fyre\ORM\Queries\ReplaceQuery` class extends the [*ReplaceQuery*](https://github.com/elusivecodes/FyreDB#replace) class. The table will be automatically set from the *Model*.

```php
$model->replaceQuery()
->values($values)
->execute();
```

### Select

The `\Fyre\ORM\Queries\SelectQuery` class extends the [*SelectQuery*](https://github.com/elusivecodes/FyreDB#select) class, while providing several additional methods and wrappers for relationship and entity mapping. The table and alias will be automatically set from the *Model*, and field names will be automatically aliased.

```php
$model->selectQuery()
->select($fields)
->where($conditions)
->execute();
```

**All**

Get the [*Result*](#results).

```php
$results = $query->all();
```

**Clear Result**

Clear the buffered result.

```php
$query->clearResult();
```

**Contain**

Set the contain relationships.

- `$contain` is a string or array containing the relationships to contain.
- `$overwrite` is a boolean indicating whether to overwrite existing contains, and will default to *false*.

```php
$query->contain($contain, $overwrite);
```

**Count**

Get the result count.

```php
$count = $query->count();
```

**Disable Auto Fields**

Disable auto fields.

```php
$query->disableAutoFields();
```

**Disable Buffering**

Disable result buffering.

```php
$query->disableBuffering();
```

**Enable Auto Fields**

Enable auto fields.

```php
$query->enableAutoFields();
```

**Enable Buffering**

Enable result buffering.

```php
$query->enableBuffering();
```

**First**

Get the first result.

```php
$entity = $query->first();
```

**Get Alias**

Get the alias.

```php
$alias = $query->getAlias();
```

**Get Connection Type**

Get the connection type.

```php
$connectionType = $query->getConnectionType();
```

**Get Contain**

Get the contain array.

```php
$contain = $query->getContain();
```

**Get Matching**

Get the matching array.

```php
$matching = $query->getMatching();
```

**Get Result**

Get the [*Result*](#results).

```php
$result = $query->getResult();
```

**Inner Join With**

INNER JOIN a relationship table.

- `$contain` is a string representing the relationships to contain.
- `$conditions` is an array containing additional join conditions.

```php
$query->innerJoinWith($contain, $conditions);
```

**Left Join With**

LEFT JOIN a relationship table.

- `$contain` is a string representing the relationships to contain.
- `$conditions` is an array containing additional join conditions.

```php
$query->leftJoinWith($contain, $conditions);
```

**Matching**

INNER JOIN a relationship table and load matching data.

- `$contain` is a string representing the relationships to contain.
- `$conditions` is an array containing additional join conditions.

```php
$query->matching($contain, $conditions);
```

The matching data will be accessible via the `_matchingData` property.

**Not Matching**

LEFT JOIN a relationship table and exclude matching rows.

- `$contain` is a string representing the relationships to contain.
- `$conditions` is an array containing additional join conditions.

```php
$query->notMatching($contain, $conditions);
```
**To Array**

Get the results as an array.

```php
$array = $query->toArray();
```

### Update

The `\Fyre\ORM\Queries\UpdateQuery` class extends the [*UpdateQuery*](https://github.com/elusivecodes/FyreDB#update) class. The table will be automatically set from the *Model*.

```php
$model->updateQuery()
->set($values)
->where($conditions)
->execute();
```

**Get Alias**

Get the alias.

```php
$alias = $query->getAlias();
```

### Update Batch

The `\Fyre\ORM\Queries\UpdateBatchQuery` class extends the [*UpdateBatchQuery*](https://github.com/elusivecodes/FyreDB#update-batch) class. The table and alias will be automatically set from the *Model*, and field names will be automatically aliased.

```php
$model->updateBatchQuery()
->set($values, $keys)
->execute();
```

**Get Alias**

Get the alias.

```php
$alias = $query->getAlias();
```

## Results

The `\Fyre\ORM\Result` class wraps the [*ResultSet*](https://github.com/elusivecodes/FyreDB#results) class, and acts as a proxy for the [*Collection*](https://github.com/elusivecodes/FyreCollection) class, providing additional handling for entity mapping and eager loading contained results.

## Relationships

Relationships can be accessed directly as a property on the model, using the relationship name.

### Belongs To

- `$name` is a string representing the relationship name.
- `$data` is an array containing relationship data.
- `classAlias` is a string representing the target class alias, and will default to the relationship name.
- `propertyName` is a string representing the entity property name, and will default to the snake case form of the singular relationship name.
- `foreignKey` is a string representing the foreign key column in the current table, and will default to the snake case singular name of the target alias (suffixed with *"_id"*).
- `bindingKey` is a string representing the matching column in the target table, and will default to the primary key.
- `strategy` is a string representing the select strategy, and will default to "*join*".
- `conditions` is an array containing additional conditions.

```php
$model->belongsTo($name, $data);
```

### Has Many

- `$name` is a string representing the relationship name.
- `$data` is an array containing relationship data.
- `classAlias` is a string representing the target class alias, and will default to the relationship name.
- `propertyName` is a string representing the entity property name, and will default to the snake case form of the relationship name.
- `foreignKey` is a string representing the foreign key column in the target table, and will default to the snake case singular name of the current alias (suffixed with *"_id"*).
- `bindingKey` is a string representing the matching column in the current table, and will default to the primary key.
- `strategy` is a string representing the select strategy, and will default to "*select*".
- `conditions` is an array containing additional conditions.
- `dependent` is a boolean indicating whether to recursively delete related data, and will default to *false*.

```php
$model->hasMany($name, $data);
```

### Has One

- `$name` is a string representing the relationship name.
- `$data` is an array containing relationship data.
- `classAlias` is a string representing the target class alias, and will default to the relationship name.
- `propertyName` is a string representing the entity property name, and will default to the snake case form of the singular relationship name.
- `foreignKey` is a string representing the foreign key column in the target table, and will default to the snake case singular name of the current alias (suffixed with *"_id"*).
- `bindingKey` is a string representing the matching column in the current table, and will default to the primary key.
- `strategy` is a string representing the select strategy, and will default to "*join*".
- `conditions` is an array containing additional conditions.
- `dependent` is a boolean indicating whether to recursively delete related data, and will default to *false*.

```php
$model->hasOne($name, $data);
```

### Many To Many

- `$name` is a string representing the relationship name.
- `$data` is an array containing relationship data.
- `classAlias` is a string representing the target class alias, and will default to the relationship name.
- `through` is a string representing the join alias, and will default to the concatenated form of the current alias and relationship name (sorted alphabetically).
- `propertyName` is a string representing the entity property name, and will default to the snake case form of the relationship name.
- `foreignKey` is a string representing the foreign key column in the join table, and will default to the snake case singular name of the current alias (suffixed with *"_id"*).
- `foreignKey` is a string representing the target foreign key column in the join table, and will default to the snake case singular name of the relationship name (suffixed with *"_id"*).
- `bindingKey` is a string representing the matching column in the current table, and will default to the primary key.
- `strategy` is a string representing the select strategy, and will default to "*select*".
- `conditions` is an array containing additional conditions.

```php
$model->manyToMany($name, $data);
```

When loading results, the join table data will be accessible via the `_joinData` property.

## Behavior Registry

```php
use Fyre\ORM\BehaviorRegistry;
```

- `$container` is a [*Container*](https://github.com/elusivecodes/FyreContainer).

```php
$behaviorRegistry = new BehaviorRegistry($container);
```

**Autoloading**

It is recommended to bind the *BehaviorRegistry* to the [*Container*](https://github.com/elusivecodes/FyreContainer) as a singleton.

```php
$container->singleton(BehaviorRegistry::class);
```

Any dependencies will be injected automatically when loading from the [*Container*](https://github.com/elusivecodes/FyreContainer).

```php
$behaviorRegistry = $container->use(BehaviorRegistry::class);
```

### Behavior Registry Methods

**Add Namespace**

Add a namespace for automatically loading behaviors.

- `$namespace` is a string representing the namespace.

```php
$behaviorRegistry->addNamespace($namespace);
```

**Build**

Build a behavior.

- `$name` is a string representing the behavior name.
- `$model` is a *Model*.
- `$options` is an array containing the behavior options, and will default to *[]*.

```php
$behavior = $behaviorRegistry->build($name, $model, $options);
```

**Clear**

Clear all namespaces and behaviors.

```php
$behaviorRegistry->clear();
```

**Find**

Find a behavior class.

- `$name` is a string representing the behavior name.

```php
$className = $behaviorRegistry->find($name);
```

**Get Namespaces**

Get the namespaces.

```php
$namespaces = $behaviorRegistry->getNamespaces();
```

**Has Namespace**

Determine whether a namespace exists.

- `$namespace` is a string representing the namespace.

```php
$hasNamespace = $behaviorRegistry->hasNamespace($namespace);
```

**Remove Namespace**

Remove a namespace.

- `$namespace` is a string representing the namespace.

```php
$behaviorRegistry->removeNamespace($namespace);
```

## Behaviors

Behaviors must be attached to a [*Model*](#models) using the `addBehavior` method. Behavior methods can then be called directly on the model.

Custom behaviors can be created by extending `\Fyre\ORM\Behavior`, suffixing the class name with "*Behavior*", and ensuring the `__construct` method accepts [*Model*](#models) as the argument (and optionally an `$options` array as the second parameter).

Behaviors can also include [callbacks](#callbacks) that will be executed during model operations.

**Get Config**

Get the configuration options.

```php
$config = $behavior->getConfig();
```

**Get Model**

Get the [*Model*](#models).

```php
$model = $behavior->getModel();
```

### Timestamp

The timestamp behavior provided a simple way to automatically update created/modified timestamps when saving data via models.

- `$options` is an array containing behavior options.
- `createdField` is a string representing the created field name, and will default to "*created*".
- `modifiedField` is a string representing the modified field name, and will default to "*modified*".

```php
$model->addBehavior('Timestamp', $options);
```

## Rules

**Add**

Add a rule.

- `$rule` is a *Closure*, that accepts an [*Entity*](https://github.com/elusivecodes/FyreEntity) as the first argument, and should return *false* if the validation failed.

```php
$rules->add($rule);
```

**Exists In**

Create an "exists in" rule.

- `$fields` is an array containing the fields.
- `$name` is the name of the relationship.
- `$options` is an array containing the rule options.
- `targetFields` is an array containing fields to match in the target table, and will default to the primary key(s).
- `callback` is a *Closure*, that accepts the [*SelectQuery*](#select) as an argument.
- `allowNullableNulls` is a boolean indicating whether to allow nullable nulls, and will default to *false*.
- `message` is a string representing the error message, and will default to the [*Lang*](https://github.com/elusivecodes/FyreLang) value for "*RuleSet.existsIn*".

```php
$rules->existsIn($fields, $name, $options);
```

**Is Clean**

Create an "is clean" rule.

- `$options` is an array containing the rule options.
- `$fields` is an array containing the fields.
- `message` is a string representing the error message, and will default to the [*Lang*](https://github.com/elusivecodes/FyreLang) value for "*RuleSet.isClean*".

```php
$rules->isClean($fields, $options);
```

**Is Unique**

Create an "is unique" rule.

- `$fields` is an array containing the fields.
- `$options` is an array containing the rule options.
- `callback` is a *Closure*, that accepts the [*SelectQuery*](#select) as an argument.
- `allowMultipleNulls` is a boolean indicating whether to allow multiple nulls, and will default to *false*.
- `message` is a string representing the error message, and will default to the [*Lang*](https://github.com/elusivecodes/FyreLang) value for "*RuleSet.isUnique*".

```php
$rules->isUnique($fields, $options);
```

**Validate**

Validate an [*Entity*](https://github.com/elusivecodes/FyreEntity).

- `$entity` is an [*Entity*](https://github.com/elusivecodes/FyreEntity).

```php
$rules->validate($entity);
```