DocumentsUpdateTrait uses trait:short, trait:short, \oihana\models\traits\signals\HasUpdateSignals, trait:short
Provides helpers to build and execute **UPDATE** AQL operations on ArangoDB documents.
This trait is responsible for partially updating existing documents in a collection using dynamically generated AQL queries with bind variables.
Unlike DocumentsReplaceTrait, which replaces the entire document and removes all unspecified attributes, UPDATE only modifies the given attributes. Any attributes that are not specified in the update document remain unchanged.
AQL Syntax
// Update a document by key:
UPDATE @key WITH { ...updatedAttributes } IN @@collection [OPTIONS {...}]
// Update using a FOR ... FILTER clause:
FOR doc IN @@collection
FILTER doc._key == @key
UPDATE doc WITH { ...updatedAttributes } IN @@collection [OPTIONS {...}]
RETURN NEW
Examples
// 1. Simple UPDATE by key:
$result = $this->update([
Arango::DOC => [ 'name' => 'Marc' ],
Arango::VALUE => '2531394',
Arango::BINDS => [ '@collection' => 'places' ]
]);
// => UPDATE @key WITH { name:'Marc' } IN @@collection RETURN NEW
// 2. UPDATE with excluded attributes:
$result = $this->update([
Arango::DOC => [ 'name' => 'Marc', 'created' => '...' ],
Arango::EXCLUDES => [ 'created' ],
Arango::VALUE => '2531394',
Arango::BINDS => [ '@collection' => 'places' ]
]);
// => The "created" field will NOT be updated
// 3. UPDATE and return the OLD document instead of the NEW one:
$result = $this->update([
Arango::DOC => [ 'name' => 'Marc' ],
Arango::VALUE => '2531394',
Arango::BINDS => [ '@collection' => 'places' ],
Arango::RETURN => Clause::OLD
]);
// => UPDATE ... RETURN OLD
// 4. Update only the "modified" timestamp using DATE_ISO8601():
$result = $this->updateDate(
'2531394',
[ Arango::BINDS => [ '@collection' => 'places' ] ],
Prop::MODIFIED
);
// => UPDATE doc WITH { modified: DATE_ISO8601(DATE_NOW()) } IN @@collection RETURN NEW
Features
- Dynamically builds optimized UPDATE AQL queries.
- Supports bind variables to prevent AQL injection.
- Allows excluding specific attributes from being updated.
- Supports returning OLD or NEW documents via Clause.
- Integrates with PrepareDocumentTrait to normalize documents.
- Uses BindTrait to manage AQL bind parameters.
- Provides a helper method updateDate() to quickly update timestamps.
Tags
Table of Contents
Constants
- FILLABLE : string = 'fillable'
- The 'fillable' parameter key.
- OMIT_WHEN_DEPRECATION : string = 'Arango::CONDITIONS carrying callables on a wri...
- The deprecation logged when a write still carries its compression predicates under the shared `Arango::CONDITIONS` key.
Properties
- $collection : string|null
- The default collection name.
- $fillable : array<string|int, mixed>|null
- The optional enumeration of all the fillable fields.
- $indexes : array<string|int, mixed>|null
- The declared indexes of the collection (the `AQL::INDEXES` list of {@see IndexOptions} or raw definitions). Retained at initialization — whether the lazy provisioning ran or not — so the declaration can be compared with the server later ({@see DoctorTrait::diagnose()}).
- $arangodb : ArangoDB|null
- The ArangoDB database reference.
- $type : int
- Indicates the type of the collection when is created (document or edge).
Methods
- analyzerExists() : bool
- Checks if an analyzer exists on the server (built-in analyzers are always reported).
- bind() : string
- Bind a value to an AQL query variable.
- bindCollection() : string
- Bind a collection name to an AQL query variable.
- bindView() : string
- Bind the model's declared View name (`AQL::VIEW` block, {@see Search::NAME}) to an AQL query variable — collection bind parameters (`@@view`) are valid for View names as well.
- collectionCreate() : bool
- Creates a new collection if not exist.
- collectionDrop() : bool
- Drops a collection if exist.
- collectionExists() : bool
- Check if collection exists
- collectionRename() : bool
- Renames a collection if exist.
- collectionTruncate() : bool
- Truncate a collection if exist.
- createIndex() : array<string|int, mixed>|null
- Creates an index on a collection on the server.
- debugQuery() : void
- Debug the passed-in query and binds variables.
- explain() : ExplainResult
- Explains an AQL query — returns the optimizer's execution plan as a typed {@see ExplainResult} (rules applied, collections, estimated cost, indexes actually used) **without executing the query**.
- foundRows() : int
- For a SELECT with a LIMIT clause, returns the number of rows that would be returned were there no LIMIT clause.
- getDatabase() : ArangoDB
- Returns the ArangoDB database singleton reference.
- getDocuments() : array<string|int, mixed>
- Prepare, execute and returns an array of all documents with the passed-in AQL query.
- getExtra() : array<string|int, mixed>
- Returns the AQL current extra datas.
- getFirstResult() : mixed
- Prepare, execute and returns the first result of the passed-in AQL query.
- getObject() : object|null
- Prepare, execute and returns an object with the passed-in AQL query.
- getProfile() : ProfileResult
- Returns the typed profile of the last profiled query run (per-phase timings, {@see ExecutionStats}, warnings).
- getResult() : array<string|int, mixed>|null
- Prepare, execute and returns an array with the passed-in AQL query.
- getStats() : ExecutionStats
- Returns the typed execution statistics of the last query (scanned / filtered / time / memory …). Most meaningful right after a profiled `list()` / `get()` (see {@see Arango::PROFILE}).
- initializeCollection() : static
- Sets the internal collection reference.
- initializeDatabase() : static
- Set the internal arangoDB reference.
- initializeFillable() : static
- Initialize the 'fillable' property.
- initializeIndexes() : static
- Sets the declared indexes of the collection from the init definition, normalizing a single {@see IndexOptions} value to a one-element list (a raw array always stays the index list) — so every consumer sees a plain `IndexOptions[]`: the {@see initializeCollection()} lazy provisioning and the {@see DoctorTrait} diagnose/repair diffs.
- prepareAndExecute() : static
- Prepare and execute an ArangoDB AQL query.
- prepareDocument() : array<string|int, mixed>
- Prepare a document before an insert, update, replace or upsert methods.
- registerProperty() : void
- Register a specific dynamic property in the binds and values collection to generates a query.
- streamDocuments() : Generator<string|int, mixed>
- Prepare, execute and returns a generator of documents with the passed-in AQL query.
- update() : object|null
- Partially updates a document in the collection.
- updateDate() : object|null
- Update a single date property in a document with the current date .
- viewCreate() : bool
- Creates an `arangosearch` View if it does not already exist.
- viewExists() : bool
- Checks if a View exists.
- executeWriteOperation() : object|null
- The main internal function to update or replace a document in a collection.
- firstRowAsArray() : array<string|int, mixed>
- Runs a single-row aggregate query and normalizes its result to an array.
- prepareDocumentClause() : string
- Prepares the document clause for a write operation (INSERT, UPDATE, REPLACE, UPSERT).
- profileOptions() : array<string|int, mixed>
- Merges the cursor `profile` option into `$options` when the `$init` array requests profiling via {@see Arango::PROFILE} (`true` → profile level 2, or an explicit integer level). Returns `$options` unchanged otherwise.
- resolveAqlConditions() : array<string|int, mixed>
- Resolves the **AQL predicates** a write adds to its `FILTER`, from {@see Arango::CONDITIONS} — the same key, and the same meaning, as every read of the model and as `delete()`, which carried them alone until now.
- resolveOmitWhen() : mixed
- Resolves the predicates deciding which attributes of the payload are dropped before a write, from the new {@see Arango::OMIT_WHEN} key or the deprecated {@see Arango::CONDITIONS} one.
- collectOptionalBindNames() : array<int, string>
- Collects every {@see AqlBindReference} name declared anywhere in one or more declaration trees — the projections (`$fields` / `$skinFields`) **and** the relation registries (`$edges` / `$joins`), typically inside a `Field::WHERE` / `Field::WHEN` condition. These are the *optional* binds : a skin (or an explicit `?fields`) can drop the carrying field — or the whole relation — from the projection, so the declared bind may not reach the final query text.
Constants
FILLABLE
The 'fillable' parameter key.
public
string
FILLABLE
= 'fillable'
OMIT_WHEN_DEPRECATION
The deprecation logged when a write still carries its compression predicates under the shared `Arango::CONDITIONS` key.
public
string
OMIT_WHEN_DEPRECATION
= 'Arango::CONDITIONS carrying callables on a write is deprecated, use Arango::OMIT_WHEN — the key means AQL predicates everywhere else.'
Properties
$collection
The default collection name.
public
string|null
$collection
$fillable
The optional enumeration of all the fillable fields.
public
array<string|int, mixed>|null
$fillable
= null
If the fillable property is null, all attributes can be inserted or updated.
$indexes
The declared indexes of the collection (the `AQL::INDEXES` list of {@see IndexOptions} or raw definitions). Retained at initialization — whether the lazy provisioning ran or not — so the declaration can be compared with the server later ({@see DoctorTrait::diagnose()}).
public
array<string|int, mixed>|null
$indexes
= null
$arangodb
The ArangoDB database reference.
protected
ArangoDB|null
$arangodb
= null
$type
Indicates the type of the collection when is created (document or edge).
protected
int
$type
Methods
analyzerExists()
Checks if an analyzer exists on the server (built-in analyzers are always reported).
public
analyzerExists(string $name) : bool
Parameters
- $name : string
-
The name of the analyzer.
Return values
boolbind()
Bind a value to an AQL query variable.
public
bind(mixed $value[, array<string|int, mixed> &$binds = [] ][, string|null $to = null ]) : string
Parameters
- $value : mixed
-
The value to bind to the query.
- $binds : array<string|int, mixed> = []
-
Reference to the array of existing bind variables.
- $to : string|null = null
-
Optional name of the bind variable. If null, a unique name is generated.
Tags
Return values
string —The formatted bind variable (including the "@" prefix as needed) for use in the query.
bindCollection()
Bind a collection name to an AQL query variable.
public
bindCollection([array<string|int, mixed> &$binds = [] ][, array<string|int, mixed> $init = [] ]) : string
Prepares a bind variable for a collection name. Uses the collection defined in $init or
falls back to $this->collection if none is provided.
Parameters
- $binds : array<string|int, mixed> = []
-
Reference to the array of existing bind variables. If null, a new array is used.
- $init : array<string|int, mixed> = []
-
Optional initialization array with keys:
- Arango::COLLECTION => the collection name to bind
- Arango::NAME => optional bind variable name
Tags
Return values
string —The formatted bind variable representing the collection.
bindView()
Bind the model's declared View name (`AQL::VIEW` block, {@see Search::NAME}) to an AQL query variable — collection bind parameters (`@@view`) are valid for View names as well.
public
bindView([array<string|int, mixed> &$binds = [] ]) : string
Parameters
- $binds : array<string|int, mixed> = []
-
Reference to the array of existing bind variables.
Tags
Return values
string —The formatted bind variable representing the View.
collectionCreate()
Creates a new collection if not exist.
public
collectionCreate(string $name[, array<string|int, mixed> $options = [] ]) : bool
Parameters
- $name : string
-
The name of the new collection
- $options : array<string|int, mixed> = []
-
- an array of options.
Options are:
- 'type' - 2 -> normal collection, 3 -> edge-collection
- 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
- 'isSystem' - false->user collection(default), true->system collection .
- 'keyOptions' - key options to use.
- 'distributeShardsLike' - name of prototype collection for identical sharding.
- 'numberOfShards' - number of shards for the collection.
- 'replicationFactor' - number of replicas to keep (default: 1).
- 'writeConcern' - minimum number of replicas to be successful when writing (default: 1).
- 'shardKeys' - array of shard key attributes.
- 'shardingStrategy' - sharding strategy to use in cluster.
- 'smartJoinAttribute' - attribute name for smart joins (if not shard key).
- 'schema' - collection schema.
Return values
bool —Returns true if the new collection is created.
collectionDrop()
Drops a collection if exist.
public
collectionDrop(string $name) : bool
Parameters
- $name : string
-
The name of the new collection
Return values
bool —Returns true if the new collection is dropped.
collectionExists()
Check if collection exists
public
collectionExists(string $name) : bool
Parameters
- $name : string
-
The name of the collection
Return values
boolcollectionRename()
Renames a collection if exist.
public
collectionRename(string $oldName, string $name) : bool
Parameters
- $oldName : string
-
The old name of the collection
- $name : string
-
The new name of the collection
Tags
Return values
bool —Returns true if the collection is renamed.
collectionTruncate()
Truncate a collection if exist.
public
collectionTruncate(string $name) : bool
Parameters
- $name : string
-
The name of the collection to truncate.
Return values
boolcreateIndex()
Creates an index on a collection on the server.
public
createIndex(string|Collection $collection, array<string|int, mixed>|IndexOptions $indexOptions) : array<string|int, mixed>|null
Parameters
- $collection : string|Collection
-
Collection name or Collection client handle.
- $indexOptions : array<string|int, mixed>|IndexOptions
-
An IndexOptions definition or an associative array of options for the index like array('type' => 'persistent', 'fields' => ['id','additionalType'], 'sparse' => false)
Tags
Return values
array<string|int, mixed>|null —The server response of the created index or null
debugQuery()
Debug the passed-in query and binds variables.
public
debugQuery(string $method, string $query, array<string|int, mixed>|null $binds) : void
Parameters
- $method : string
- $query : string
- $binds : array<string|int, mixed>|null
explain()
Explains an AQL query — returns the optimizer's execution plan as a typed {@see ExplainResult} (rules applied, collections, estimated cost, indexes actually used) **without executing the query**.
public
explain(AqlQuery|string $query[, array<string, mixed> $bindVars = [] ][, array<string, mixed> $options = [] ]) : ExplainResult
Parameters
- $query : AqlQuery|string
-
The AQL query to explain.
- $bindVars : array<string, mixed> = []
-
Bind variables (omit when
$queryis an AqlQuery). - $options : array<string, mixed> = []
-
Explain options (
allPlans,optimizer.rules, …).
Tags
Return values
ExplainResultfoundRows()
For a SELECT with a LIMIT clause, returns the number of rows that would be returned were there no LIMIT clause.
public
foundRows() : int
Return values
intgetDatabase()
Returns the ArangoDB database singleton reference.
public
getDatabase() : ArangoDB
Return values
ArangoDBgetDocuments()
Prepare, execute and returns an array of all documents with the passed-in AQL query.
public
getDocuments(string $query[, array<string|int, mixed> $bindVars = [] ][, array<string|int, mixed> $options = [] ][, bool $raw = false ][, null|SchemaResolver|Closure|string $schema = null ][, array<string|int, mixed> $context = [] ]) : array<string|int, mixed>
Parameters
- $query : string
-
The AQL query string to execute
- $bindVars : array<string|int, mixed> = []
-
Optional bind variables for the query
- $options : array<string|int, mixed> = []
-
Optional execution options
- $raw : bool = false
-
If true, returns the object raw (no schema or alter applied)
- $schema : null|SchemaResolver|Closure|string = null
-
The optional class name to map the document.
- $context : array<string|int, mixed> = []
-
Optional opaque context forwarded to AlterDocumentTrait::alter() and thus to the
Alter::MAPcallbacks (e.g. the originating$init, a skin, a locale…). Default[].
Tags
Return values
array<string|int, mixed>getExtra()
Returns the AQL current extra datas.
public
getExtra() : array<string|int, mixed>
Return values
array<string|int, mixed>getFirstResult()
Prepare, execute and returns the first result of the passed-in AQL query.
public
getFirstResult(string $query[, array<string|int, mixed> $bindVars = [] ][, array<string|int, mixed> $options = [] ][, bool $raw = false ][, null|SchemaResolver|Closure|string $schema = null ][, array<string|int, mixed> $context = [] ]) : mixed
Parameters
- $query : string
-
The AQL query string to execute
- $bindVars : array<string|int, mixed> = []
-
Optional bind variables for the query
- $options : array<string|int, mixed> = []
-
Optional execution options
- $raw : bool = false
-
If true, returns the object raw (no schema or alter applied)
- $schema : null|SchemaResolver|Closure|string = null
-
The optional class name to map the document.
- $context : array<string|int, mixed> = []
-
Optional opaque context forwarded to AlterDocumentTrait::alter() and thus to the
Alter::MAPcallbacks (e.g. the originating$init, a skin, a locale…). Default[].
Tags
getObject()
Prepare, execute and returns an object with the passed-in AQL query.
public
getObject(string $query[, array<string|int, mixed> $bindVars = [] ][, array<string|int, mixed> $options = [] ][, bool $raw = false ][, null|SchemaResolver|Closure|string $schema = null ][, array<string|int, mixed> $context = [] ]) : object|null
Parameters
- $query : string
-
The AQL query string to execute
- $bindVars : array<string|int, mixed> = []
-
Optional bind variables for the query
- $options : array<string|int, mixed> = []
-
Optional execution options
- $raw : bool = false
-
If true, returns the object raw (no schema or alter applied)
- $schema : null|SchemaResolver|Closure|string = null
-
The optional class name to map the document.
- $context : array<string|int, mixed> = []
-
Optional opaque context forwarded to AlterDocumentTrait::alter() and thus to the
Alter::MAPcallbacks (e.g. the originating$init, a skin, a locale…). Default[].
Tags
Return values
object|nullgetProfile()
Returns the typed profile of the last profiled query run (per-phase timings, {@see ExecutionStats}, warnings).
public
getProfile() : ProfileResult
Return values
ProfileResultgetResult()
Prepare, execute and returns an array with the passed-in AQL query.
public
getResult(string $query[, array<string|int, mixed> $bindVars = [] ][, array<string|int, mixed> $options = [] ][, bool $raw = false ][, null|SchemaResolver|Closure|string $schema = null ][, array<string|int, mixed> $context = [] ]) : array<string|int, mixed>|null
Parameters
- $query : string
-
The AQL query string to execute
- $bindVars : array<string|int, mixed> = []
-
Optional bind variables for the query
- $options : array<string|int, mixed> = []
-
Optional execution options
- $raw : bool = false
-
If true, returns the object raw (no schema or alter applied)
- $schema : null|SchemaResolver|Closure|string = null
-
The optional class name to map the document.
- $context : array<string|int, mixed> = []
-
Optional opaque context forwarded to AlterDocumentTrait::alter() and thus to the
Alter::MAPcallbacks (e.g. the originating$init, a skin, a locale…). Default[].
Tags
Return values
array<string|int, mixed>|nullgetStats()
Returns the typed execution statistics of the last query (scanned / filtered / time / memory …). Most meaningful right after a profiled `list()` / `get()` (see {@see Arango::PROFILE}).
public
getStats() : ExecutionStats
Return values
ExecutionStatsinitializeCollection()
Sets the internal collection reference.
public
initializeCollection([array<string|int, mixed> $init = [] ][, int $type = CollectionType::DOCUMENT ]) : static
Parameters
- $init : array<string|int, mixed> = []
-
The options to lazy creates the collection (document or edge) or not.
- collection (string) Indicates if the name of the collection.
- indexes (array) The optional list of indexes to creates (if not exist and lazy).
- lazy (bool) Indicates if the collection is created if not exist — resolved through
LazyTrait::isLazy(), so a
lazyentry defined in the DI container always wins (orchestration kill-switch), then this init key, then the property default. - options (array) The options are:
- 'waitForSync' : if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
- 'isSystem' : false->user collection(default), true->system collection .
- 'keyOptions' : key options to use.
- 'distributeShardsLike' : name of prototype collection for identical sharding.
- 'numberOfShards' : number of shards for the collection.
- 'replicationFactor' : number of replicas to keep (default: 1).
- 'writeConcern' : minimum number of replicas to be successful when writing (default: 1).
- 'shardKeys' : array of shard key attributes.
- 'shardingStrategy' : sharding strategy to use in cluster.
- 'smartJoinAttribute' : attribute name for smart joins (if not shard key).
- 'schema' : collection schema.
- $type : int = CollectionType::DOCUMENT
-
The default type of the collection (Default -> 'document' [2] )
Tags
Return values
staticinitializeDatabase()
Set the internal arangoDB reference.
public
initializeDatabase([array<string|int, mixed> $init = [] ][, ContainerInterface|null $container = null ]) : static
Parameters
- $init : array<string|int, mixed> = []
- $container : ContainerInterface|null = null
Tags
Return values
staticinitializeFillable()
Initialize the 'fillable' property.
public
initializeFillable([array<string|int, mixed> $init = [] ]) : static
Parameters
- $init : array<string|int, mixed> = []
Return values
staticinitializeIndexes()
Sets the declared indexes of the collection from the init definition, normalizing a single {@see IndexOptions} value to a one-element list (a raw array always stays the index list) — so every consumer sees a plain `IndexOptions[]`: the {@see initializeCollection()} lazy provisioning and the {@see DoctorTrait} diagnose/repair diffs.
public
initializeIndexes([array<string|int, mixed> $init = [] ]) : static
Parameters
- $init : array<string|int, mixed> = []
-
The init definition (reads the
Arango::INDEXESkey).
Return values
staticprepareAndExecute()
Prepare and execute an ArangoDB AQL query.
public
prepareAndExecute(string $query[, array<string|int, mixed> $bindVars = [] ][, array<string|int, mixed> $options = [] ][, array<string|int, mixed>|null $optionalBinds = null ]) : static
A bind variable may be optional : supplied by the caller (through
Arango::BINDS) yet not guaranteed to appear in the final query text. This
happens with a conditional projection — e.g. an aqlBindRef() inside a
Field::WHERE / Field::WHEN carried by a field that the active skin (or an
explicit ?fields) does not project. ArangoDB rejects a query that declares
a bind it never references ("bind parameter 'x' was not declared in the
query"), so such a leftover bind must be dropped before execution.
$optionalBinds names the binds that are allowed to be absent :
- it is opt-in and bounded — a bind whose name is not listed is never touched, so a query that uses no conditional bind behaves exactly as before ;
- a listed bind is kept only when the query actually references it
(
@name, word-boundary matched to avoid a prefix collision such as@offersmatching inside@offersScope) ; - passing
[]disables the pruning explicitly.
When $optionalBinds is null (the default), the list is derived from the
model's own declarations — every AqlBindReference found anywhere in
$this->fields / $this->skinFields and in the relation registries
$this->edges / $this->joins (see collectOptionalBindNames()).
The registries matter as much as the projections: a relation definition is a
declaration tree of its own, it can carry a conditional bind (in its own
AQL::FIELDS sub-projection, or in a definition-level predicate), and a skin
dropping the relation leaves that bind unreferenced exactly the same way.
The source of truth is the same aqlBindRef() that declared the conditional
bind, so no host wiring is required, and over-listing a bind that turns out to
be always present is inert (a referenced bind is always kept). Because this
runs at the single execution chokepoint, it protects every query method
(get(), list(), count(), exist(), edges…) uniformly.
Parameters
- $query : string
-
The AQL query string to execute.
- $bindVars : array<string|int, mixed> = []
-
Optional bind variables for the query.
- $options : array<string|int, mixed> = []
-
Optional execution options.
- $optionalBinds : array<string|int, mixed>|null = null
-
Names of binds allowed to be absent from the query.
nullderives the list from the model field definitions and relation registries ;[]disables the pruning.
Tags
Return values
staticprepareDocument()
Prepare a document before an insert, update, replace or upsert methods.
public
prepareDocument(string|array<string|int, mixed>|object|null $definition, array<string|int, mixed> &$binds[, array<string|int, mixed> $document = [] ][, array<string|int, mixed>|null $excludes = null ]) : array<string|int, mixed>
Filter the document attributes if the fillable property definition exist.
Parameters
- $definition : string|array<string|int, mixed>|object|null
-
The document definition to prepare.
- $binds : array<string|int, mixed>
-
The binding variable container.
- $document : array<string|int, mixed> = []
-
The optional key/value pairs to insert in the final document.
- $excludes : array<string|int, mixed>|null = null
-
The optional properties to excludes in the final document definition.
Tags
Return values
array<string|int, mixed>registerProperty()
Register a specific dynamic property in the binds and values collection to generates a query.
public
registerProperty(string $name, mixed $value, array<string|int, mixed> &$binds, array<string|int, mixed> &$values[, string $prefix = Char::EMPTY ][, string $separator = ': ' ]) : void
Parameters
- $name : string
- $value : mixed
- $binds : array<string|int, mixed>
- $values : array<string|int, mixed>
- $prefix : string = Char::EMPTY
- $separator : string = ': '
streamDocuments()
Prepare, execute and returns a generator of documents with the passed-in AQL query.
public
streamDocuments(string $query[, array<string|int, mixed> $bindVars = [] ][, array<string|int, mixed> $options = [] ][, bool $raw = false ][, null|SchemaResolver|Closure|string $schema = null ][, array<string|int, mixed> $context = [] ]) : Generator<string|int, mixed>
Documents are yielded one by one, allowing efficient memory usage for large result sets.
Parameters
- $query : string
-
The AQL query string to execute
- $bindVars : array<string|int, mixed> = []
-
Optional bind variables for the query
- $options : array<string|int, mixed> = []
-
Optional execution options
- $raw : bool = false
-
If true, returns the object raw (no schema or alter applied)
- $schema : null|SchemaResolver|Closure|string = null
-
The optional class name to map the document.
- $context : array<string|int, mixed> = []
-
Optional opaque context forwarded to AlterDocumentTrait::alter() and thus to the
Alter::MAPcallbacks (e.g. the originating$init, a skin, a locale…). Default[].
Tags
Return values
Generator<string|int, mixed> —Generator yielding documents one by one
update()
Partially updates a document in the collection.
public
update([array{doc?: array|object|null, key?: string|null, excludes?: string[]|null, value?: mixed, prefix?: string|null, binds?: array|null, options?: array|string|object|null, return?: string|null} $init = [] ]) : object|null
This method generates and executes an AQL UPDATE operation on the targeted document.
Only the attributes specified in the doc array or object are modified; any other
attributes in the existing document remain unchanged. Immutable system attributes
(such as _key, _id, _rev) are never overwritten.
AQL Syntax
// Update using a key:
UPDATE @key WITH { ...updatedAttributes } IN @@collection [OPTIONS {...}]
// Update using a FOR ... FILTER clause:
FOR doc IN @@collection
FILTER doc._key == @key
UPDATE doc WITH { ...updatedAttributes } IN @@collection [OPTIONS {...}]
RETURN NEW
Initialization Options ($init)
Parameters
- $init : array{doc?: array|object|null, key?: string|null, excludes?: string[]|null, value?: mixed, prefix?: string|null, binds?: array|null, options?: array|string|object|null, return?: string|null} = []
-
Examples*
// 1. Update a document by key: $result = $this->update ([ Arango::DOC => [ 'name' => 'Marc' ], Arango::VALUE => '2531394', Arango::BINDS => [ '@collection' => 'places' ] ]); // 2. Update excluding certain fields: $result = $this->update ([ Arango::DOC => [ 'name' => 'Marc', 'created' => '...' ], Arango::EXCLUDES => [ 'created' ], Arango::VALUE => '2531394' ]); // 3. Update and return the OLD document: $result = $this->update ([ Arango::DOC => [ 'name' => 'Marc' ], Arango::VALUE => '2531394', Arango::RETURN => Clause::OLD ]);
Tags
Return values
object|null —The updated document, or null if no document matched the key.
updateDate()
Update a single date property in a document with the current date .
public
updateDate([array<string|int, mixed> $init = [] ][, string $property = Schema::MODIFIED ]) : object|null
By default, it updates the modified property with the current timestamp.
Parameters
- $init : array<string|int, mixed> = []
-
Additional options like binds, return clause, etc.
- $property : string = Schema::MODIFIED
-
The document property to update (default: Schema::MODIFIED).
Tags
Return values
object|null —The updated document.
viewCreate()
Creates an `arangosearch` View if it does not already exist.
public
viewCreate(string $name[, array<string|int, mixed> $links = [] ][, array<string|int, mixed> $options = [] ]) : bool
Parameters
- $name : string
-
The name of the new View.
- $links : array<string|int, mixed> = []
-
Per-collection link map (collection name → link definition).
- $options : array<string|int, mixed> = []
-
Extra arangosearch options forwarded verbatim.
Return values
bool —Returns true if the new View has been created.
viewExists()
Checks if a View exists.
public
viewExists(string $name) : bool
Parameters
- $name : string
-
The name of the View.
Return values
boolexecuteWriteOperation()
The main internal function to update or replace a document in a collection.
protected
executeWriteOperation(array{value?: mixed|null, doc?: array|object|string|null, key?: string|null, prefix?: string|null, binds?: array|null, excludes?: string[]|null, options?: array|string|object|null, return?: string|null, debug?: bool|null} $init[, string $operation = Operation::UPDATE ]) : object|null
This method builds and executes an AQL UPDATE or REPLACE query for a given document.
It supports bind variables, exclusion of certain fields, custom options, and returning
either the NEW or OLD document after the operation.
Supported $init options*
Parameters
- $init : array{value?: mixed|null, doc?: array|object|string|null, key?: string|null, prefix?: string|null, binds?: array|null, excludes?: string[]|null, options?: array|string|object|null, return?: string|null, debug?: bool|null}
- $operation : string = Operation::UPDATE
-
The type of operation:
Operation::UPDATEorOperation::REPLACE.
Tags
Return values
object|null —Returns the updated or replaced document, or null if no matching document was found.
firstRowAsArray()
Runs a single-row aggregate query and normalizes its result to an array.
protected
firstRowAsArray(string $query[, array<string|int, mixed> $bindVars = [] ]) : array<string|int, mixed>
The aggregate queries — DocumentsBoundsTrait::bounds(), DocumentsFacetCountsTrait::facetCounts() — all return one row holding one entry per requested dimension, and all face the same two shapes: their builder yields an empty string when nothing is computable, and the row itself comes back as an object or as an array depending on how the driver decoded it. Both are handled here rather than at each call site.
The result is read raw — no schema, no alter() — because the row is a
map of computed values, not a document.
Parameters
- $query : string
-
The compiled aggregate query, or an empty string when there is nothing to compute.
- $bindVars : array<string|int, mixed> = []
-
The bind variables of that query.
Tags
Return values
array<string|int, mixed> —The single row as an associative array; an empty array when the query is empty or the row is neither an object nor an array.
prepareDocumentClause()
Prepares the document clause for a write operation (INSERT, UPDATE, REPLACE, UPSERT).
protected
prepareDocumentClause(mixed $doc, string $operation, array<string|int, mixed> &$binds[, array<string|int, mixed>|null $removeKeys = null ][, array<string|int, mixed>|null $conditions = null ][, Closure|null $ensure = null ]) : string
This method processes a document (array, object, or AQL string) to transform it into a usable AQL string.
It also handles the automatic addition of created and modified fields, and binds the values to query variables.
Parameters
- $doc : mixed
-
The document to prepare (associative array, object, or AQL string).
- $operation : string
-
The current operation (e.g.,
Operation::UPDATE,Operation::INSERT,Operation::REPLACE,Operation::SEARCH). - $binds : array<string|int, mixed>
-
The binds array, passed by reference to be modified.
- $removeKeys : array<string|int, mixed>|null = null
-
An array of attributes to remove keys from the document.
- $conditions : array<string|int, mixed>|null = null
-
One or more callback conditions: fn(mixed $value): bool. If null, the null properties (object) and keys (array) are unset. If [], the document is not compressed.
- $ensure : Closure|null = null
-
A callback function to ensure some attributes in the final document clause ensureKeyValue()
Tags
Return values
string —The AQL document clause as a string.
profileOptions()
Merges the cursor `profile` option into `$options` when the `$init` array requests profiling via {@see Arango::PROFILE} (`true` → profile level 2, or an explicit integer level). Returns `$options` unchanged otherwise.
protected
profileOptions(array<string|int, mixed> $init[, array<string|int, mixed> $options = [] ]) : array<string|int, mixed>
Parameters
- $init : array<string|int, mixed>
-
The model input array (
list()/get()). - $options : array<string|int, mixed> = []
-
The cursor options to augment.
Return values
array<string|int, mixed>resolveAqlConditions()
Resolves the **AQL predicates** a write adds to its `FILTER`, from {@see Arango::CONDITIONS} — the same key, and the same meaning, as every read of the model and as `delete()`, which carried them alone until now.
protected
resolveAqlConditions(array<string|int, mixed> $init) : array<string|int, mixed>
This is what makes a write scopeable: an UPDATE / REPLACE narrowed by the
caller's predicate matches nothing when the document is outside the scope, so
it writes nothing and RETURN NEW yields null.
Only the strings are kept. During the deprecation window the key can still
carry the write-side callables, which belong to resolveOmitWhen() and
would break predicates() if they reached the FILTER. Once the deprecation
is removed the filter becomes unnecessary and the key can be spread as-is,
exactly like the reads do.
Parameters
- $init : array<string|int, mixed>
-
The write configuration.
Return values
array<string|int, mixed> —The AQL predicate strings to append to the write's FILTER.
resolveOmitWhen()
Resolves the predicates deciding which attributes of the payload are dropped before a write, from the new {@see Arango::OMIT_WHEN} key or the deprecated {@see Arango::CONDITIONS} one.
protected
resolveOmitWhen(array<string|int, mixed> $init[, mixed $default = null ]) : mixed
CONDITIONS is read as AQL predicate strings by every read of the model
— and by delete() — but as callables by the four writes, which is why a
cross-cutting hook posing a scope on every model call used to answer
All conditions in the array must be callable on POST / PATCH / PUT.
OMIT_WHEN gives the write meaning a name of its own, so the shared key can
eventually mean one thing everywhere.
Resolution, in order:
OMIT_WHENpresent → used as-is, including an explicitnull(restore the default null-compression) or[](disable it) ;- otherwise
CONDITIONSis read with the caller's own default, and a deprecation is logged only when it actually carries callables — the legacy write usage. A caller that never used it sees nothing.
Strings are handed through untouched, so they keep raising in compress()
rather than being silently ignored: the write FILTER does not read them
yet, and turning a loud failure into a write that proceeds without the scope
its author intended would be the worse outcome.
Parameters
- $init : array<string|int, mixed>
-
The write configuration.
- $default : mixed = null
-
The caller's own default —
nullrestores the null-compression,[]disables it.
Return values
mixed —The compression predicates to hand to prepareDocumentClause().
collectOptionalBindNames()
Collects every {@see AqlBindReference} name declared anywhere in one or more declaration trees — the projections (`$fields` / `$skinFields`) **and** the relation registries (`$edges` / `$joins`), typically inside a `Field::WHERE` / `Field::WHEN` condition. These are the *optional* binds : a skin (or an explicit `?fields`) can drop the carrying field — or the whole relation — from the projection, so the declared bind may not reach the final query text.
private
collectOptionalBindNames(array<string|int, mixed> ...$trees) : array<int, string>
The walk is recursive and depth-agnostic : it descends into Field::FIELDS,
edges and joins sub-definitions, and picks up a bind reference wherever it
sits. Non-array leaves are visited but ignored, so a registry holding a
resolved model instance or a callable is harmless. Collecting the raw
(un-skinned) definitions is intentional — the superset of all
possibly-optional binds is exactly what the execution layer must be allowed
to prune.
Parameters
- $trees : array<string|int, mixed>
-
One or more declaration arrays to scan.
Return values
array<int, string> —The de-duplicated list of bind names.