DbCollection

Mirage 的 Db 有許多 DbCollections,它們等同於傳統資料庫中的表格。它們儲存特定類型的資料,例如 usersposts

DbCollections 有名稱,例如 users,您可以使用這些名稱從 Db 物件存取集合。

假設您已定義了 user 模型,並且以下資料已插入到您的資料庫中(透過工廠或 fixture)

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

那麼 db.contacts 將會傳回這個陣列。

方法

find(ids: any): any

如果 ids 是單個 ID,則從 collection 中傳回單個記錄;如果 ids 是 ID 的陣列,則傳回記錄的陣列。請注意,每個 ID 可以是整數或字串,但整數 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(Plain Old JavaScript Object)。

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

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