DbCollection

Mirage 的 Db 拥有许多 DbCollections,它们等同于传统数据库中的表格。它们存储特定类型的数据,例如 usersposts

DbCollections 有名称,例如 users,你可以使用它从 Db 对象访问该集合。

假设你定义了一个 user 模型,并将以下数据插入数据库(通过工厂或夹具)。

export default [
  { id: 1, name: 'Zelda' },
  { id: 2, name: 'Link' }
];

那么 db.contacts 将返回此数组。

方法

find(ids: any): any

如果 ids 是单个 id,则从 collection 返回单个记录,或者如果 ids 是 id 数组,则返回记录数组。请注意,每个 id 可以是 int 或字符串,但整数 id 作为字符串(例如字符串“1”)将被视为整数。

// 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

返回 collection 中与 query 对象中的键值对匹配的第一个模型。请注意,使用字符串比较。 query 是一个 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

collection 中查找与提供的 query 匹配的第一个记录,或者使用 query 和可选 attributesForCreate 的合并创建新记录。

通常,你的 API 存根中可能会出现以下模式

// 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' });
}

现在你可以用以下内容替换它

let record = db.users.firstOrCreate({ name: 'Link' });

使用 attributesForCreate 的扩展示例

let record = db.users.firstOrCreate({ name: 'Link' }, { evil: false });

insert(data: any): any

data 插入集合。 data 可以是单个对象或对象数组。返回插入的记录。

// 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

删除 collection 中的一条或多条记录。

如果 target 未定义,则删除所有记录。如果 target 是数字或字符串,则使用 target 作为 id 删除单个记录。如果 target 是 POJO,则查询 collection 以查找与 target 中的键值对匹配的记录,并将其从集合中删除。

// 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

更新集合中的一条或多条记录。

如果 attrs 是唯一存在的参数,则根据 attrs 中的键值对更新集合中的所有记录。

如果 target 存在,则将更新限制为与 target 匹配的那些更新。如果 target 是数字或字符串,则查找 id 为 target 的单个记录以更新。如果 target 是 POJO,则查询 collection 以查找与 target 中的键值对匹配的记录,并更新其 attrs

返回更新的记录或记录。

// 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

返回 collection 中与 query 对象中的键值对匹配的模型数组。请注意,使用字符串比较。 query 是一个 POJO。

// Given users = [ { id: 1, name: 'Link' }, { id: 2, name: 'Zelda' } ]

db.users.where({ name: 'Zelda' }); // [ { id: 2, name: 'Zelda' } ]