Constructor
new Spell(Model, opts)
Create a spell.
Parameters:
| Name | Type | Description |
|---|---|---|
Model |
Model
|
A sub class of |
opts |
Object
|
Extra attributes to be set. |
Members
dup
Get a duplicate of current spell.
Model
A sub-class of Bone.
Methods
$forceIndex(…hints) → {Spell}
Parameters:
| Name | Type | Attributes | Description |
|---|---|---|---|
hints |
string
|
object
|
<repeatable> |
Returns:
- Type:
-
Spell
Example:
.forceIndex('idx_id')
.forceIndex('idx_id', 'idx_title_id')
.forceIndex('idx_id', { orderBy: ['idx_title', 'idx_org_id'] }, { groupBy: 'idx_type' })
$from(table) → {Spell}
Set the table of the spell. If an instance of Spell is passed, it will be used as a derived table.
Parameters:
| Name | Type | Description |
|---|---|---|
table |
string
|
Spell
|
Returns:
- Type:
-
Spell
$get(index) → {Bone}
Get nth record.
Parameters:
| Name | Type | Description |
|---|---|---|
index |
number
|
Returns:
- Type:
-
Bone
$group(…names) → {Spell}
Set GROUP BY attributes. select_expr with AS is supported, hence following expressions have the same effect:
.select('YEAR(createdAt)) AS year').group('year');
Parameters:
| Name | Type | Attributes | Description |
|---|---|---|---|
names |
string
|
<repeatable> |
Returns:
- Type:
-
Spell
Example:
.group('city');
.group('YEAR(createdAt)');
$having(conditions, …values) → {Spell}
Set the HAVING conditions, which usually appears in GROUP queries only.
Parameters:
| Name | Type | Attributes | Description |
|---|---|---|---|
conditions |
string
|
Object
|
||
values |
*
|
<repeatable> |
Returns:
- Type:
-
Spell
Example:
.having('average between ? and ?', 10, 20);
.having('maximum > 42');
.having({ count: 5 });
$ignoreIndex(…hints) → {Spell}
Parameters:
| Name | Type | Attributes | Description |
|---|---|---|---|
hints |
string
|
object
|
<repeatable> |
Returns:
- Type:
-
Spell
Example:
.ignoreIndex('idx_id')
.ignoreIndex('idx_id', 'idx_title_id')
.ignoreIndex('idx_id', { orderBy: ['idx_title', 'idx_org_id'] }, { groupBy: 'idx_type' })
$join(Model, onConditions, …values) → {Spell}
LEFT JOIN arbitrary models with specified ON conditions.
Parameters:
| Name | Type | Attributes | Description |
|---|---|---|---|
Model |
Model
|
||
onConditions |
string
|
Object
|
||
values |
*
|
<repeatable> |
Returns:
- Type:
-
Spell
Example:
.join(User, 'users.id = posts.authorId');
.join(TagMap, 'tagMaps.targetId = posts.id and tagMaps.targetType = 0');
$limit(rowCount) → {Spell}
Set the LIMIT of the query.
Parameters:
| Name | Type | Description |
|---|---|---|
rowCount |
number
|
Returns:
- Type:
-
Spell
$offset(skip) → {Spell}
Set the OFFSET of the query.
Parameters:
| Name | Type | Description |
|---|---|---|
skip |
number
|
Returns:
- Type:
-
Spell
$optimizerHints(…hints) → {Spell}
add optimizer hints to query
Parameters:
| Name | Type | Attributes | Description |
|---|---|---|---|
hints |
string
|
<repeatable> |
Returns:
- Type:
-
Spell
Example:
.optimizerHints('SET_VAR(foreign_key_checks=OFF)')
.optimizerHints('SET_VAR(foreign_key_checks=OFF)', 'MAX_EXECUTION_TIME(1000)')
$order(name, direction) → {Spell}
Set the ORDER of the query
Parameters:
| Name | Type | Description |
|---|---|---|
name |
string
|
Object
|
|
direction |
string
|
Returns:
- Type:
-
Spell
Example:
.order('title');
.order('title', 'desc');
.order({ title: 'desc' });
.order('id asc, gmt_created desc')
$select(…names)
Whitelist attributes to select. Can be called repeatedly to select more attributes.
Parameters:
| Name | Type | Attributes | Description |
|---|---|---|---|
names |
string
|
<repeatable> |
Example:
.select('title');
.select('title', 'createdAt');
.select('IFNULL(title, "Untitled")');
$useIndex(…hints) → {Spell}
Parameters:
| Name | Type | Attributes | Description |
|---|---|---|---|
hints |
string
|
object
|
<repeatable> |
Returns:
- Type:
-
Spell
Example:
.useIndex('idx_id')
.useIndex('idx_id', 'idx_title_id')
.useIndex('idx_id', { orderBy: ['idx_title', 'idx_org_id'] }, { groupBy: 'idx_type' })
$where(conditions, …values) → {Spell}
Set WHERE conditions. Both string conditions and object conditions are supported.
Parameters:
| Name | Type | Attributes | Description |
|---|---|---|---|
conditions |
string
|
Object
|
||
values |
*
|
<repeatable> |
only necessary when using templated string conditions |
Returns:
- Type:
-
Spell
Example:
.where({ foo: null });
.where('foo = ? and bar >= ?', null, 42);
$with(…qualifiers) → {Spell}
LEFT JOIN predefined associations in model.
Parameters:
| Name | Type | Attributes | Description |
|---|---|---|---|
qualifiers |
string
|
<repeatable> |
Returns:
- Type:
-
Spell
Example:
.with('attachment');
.with('attachment', 'comments');
.with({ comments: { select: 'content' } });
(async, generator) batch(size) → {Object}
Get the query results by batch. Returns an async iterator which can then be consumed with an async loop or the cutting edge for await. The iterator is an Object that contains a next() method:
const iterator = {
i: 0,
next: () => Promise.resolve(this.i++);
}
See examples to consume async iterators properly. Currently async iterator is proposed and implemented by V8 but hasn't made into Node.js LTS yet.
Parameters:
| Name | Type | Default | Description |
|---|---|---|---|
size |
number
|
1000 |
Returns:
- Type:
-
Object
Example:
async function consume() {
const batch = Post.all.batch();
while (true) {
const { done, value: post } = await batch.next();
if (value) handle(post);
if (done) break
}
}
// or
for await (const post of Post.all.batch()) {
handle(post);
}
catch(reject)
Parameters:
| Name | Type | Description |
|---|---|---|
reject |
function
|
finally(onFinally)
Parameters:
| Name | Type | Description |
|---|---|---|
onFinally |
function
|
nodeify(callback)
- https://nodejs.org/en/knowledge/errors/what-are-the-error-conventions/
Parameters:
| Name | Type | Description |
|---|---|---|
callback |
function
|
then(resolve, reject)
Fake spell as a thenable object so it can be consumed like a regular Promise.
Parameters:
| Name | Type | Default | Description |
|---|---|---|---|
resolve |
function
|
null | |
reject |
function
|
Example:
const post = await Post.first
Post.last.then(post => handle(post));
toSqlString() → {string}
Format current spell to SQL string.
Returns:
- Type:
-
string