DbCollection
Mirage's Db
has many DbCollections
, which are equivalent to tables from traditional databases. They store specific types of data, for example users
and posts
.
DbCollections
have names, like users
, which you use to access the collection from the Db
object.
Suppose you had a user
model defined, and the following data had been inserted into your database (either through factories or fixtures):
export default [
{ id: 1, name: 'Zelda' },
{ id: 2, name: 'Link' }
];
Then db.contacts
would return this array.
Methods
find(ids: any): any
Returns a single record from the collection
if ids
is a single
id, or an array of records if ids
is an array of ids. Note
each id can be an int or a string, but integer ids as strings
(e.g. the string “1”) will be treated as integers.
// Given users = [{id: 1, name: 'Link'}, {id: 2, name: 'Zelda'}]
db.users.find(1); // {id: 1, name: 'Link'}
db.users.find([1, 2]); // [{id: 1, name: 'Link'}, {id: 2, name: 'Zelda'}]
findBy(query: any): any
Returns the first model from collection
that matches the
key-value pairs in the query
object. Note that a string
comparison is used. query
is a POJO.
// Given users = [ { id: 1, name: 'Link' }, { id: 2, name: 'Zelda' } ]
db.users.findBy({ name: 'Link' }); // { id: 1, name: 'Link' }
firstOrCreate(query: any, attributesForCreate: any): any
Finds the first record matching the provided query in
collection
, or creates a new record using a merge of the
query
and optional attributesForCreate
.
Often times you may have a pattern like the following in your API stub:
// Given users = [
// { id: 1, name: 'Link' },
// { id: 2, name: 'Zelda' }
// ]
// Create Link if he doesn't yet exist
let records = db.users.where({ name: 'Link' });
let record;
if (records.length > 0) {
record = records[0];
} else {
record = db.users.insert({ name: 'Link' });
}
You can now replace this with the following:
let record = db.users.firstOrCreate({ name: 'Link' });
An extended example using attributesForCreate:
let record = db.users.firstOrCreate({ name: 'Link' }, { evil: false });
insert(data: any): any
Inserts data
into the collection. data
can be a single object
or an array of objects. Returns the inserted record.
// Insert a single record
let link = db.users.insert({ name: 'Link', age: 173 });
link; // { id: 1, name: 'Link', age: 173 }
// Insert an array
let users = db.users.insert([
{ name: 'Zelda', age: 142 },
{ name: 'Epona', age: 58 },
]);
users; // [ { id: 2, name: 'Zelda', age: 142 }, { id: 3, name: 'Epona', age: 58 } ]
remove(target: any): any
Removes one or more records in collection.
If target is undefined, removes all records. If target is a number or string, removes a single record using target as id. If target is a POJO, queries collection for records that match the key-value pairs in target, and removes them from the collection.
// Given users = [
// {id: 1, name: 'Link'},
// {id: 2, name: 'Zelda'}
// ]
db.users.remove(); // db.users = []
db.users.remove(1); // db.users = [{id: 2, name: 'Zelda'}]
db.users.remove({name: 'Zelda'}); // db.users = [{id: 1, name: 'Link'}]
update(target: any, attrs: any): any
Updates one or more records in the collection.
If attrs is the only arg present, updates all records in the collection according to the key-value pairs in attrs.
If target is present, restricts updates to those that match target. If target is a number or string, finds a single record whose id is target to update. If target is a POJO, queries collection for records that match the key-value pairs in target, and updates their attrs.
Returns the updated record or records.
// Given users = [
// {id: 1, name: 'Link'},
// {id: 2, name: 'Zelda'}
// ]
db.users.update({name: 'Ganon'}); // db.users = [{id: 1, name: 'Ganon'}, {id: 2, name: 'Ganon'}]
db.users.update(1, {name: 'Young Link'}); // db.users = [{id: 1, name: 'Young Link'}, {id: 2, name: 'Zelda'}]
db.users.update({name: 'Link'}, {name: 'Epona'}); // db.users = [{id: 1, name: 'Epona'}, {id: 2, name: 'Zelda'}]
where(query: any): any
Returns an array of models from collection
that match the
key-value pairs in the query
object. Note that a string
comparison is used. query
is a POJO.
// Given users = [ { id: 1, name: 'Link' }, { id: 2, name: 'Zelda' } ]
db.users.where({ name: 'Zelda' }); // [ { id: 2, name: 'Zelda' } ]