Where do I define Models?
モデルは、Sailsアプリケーション内の api/models/ directory
に定義される。モデルはコマンド・ラインで生成できる。
sails generate model Person
Automatic schema creation
コンフィギュレーションによって、データベーステーブルは自動的に再作成させることができる。
Querying Models
コントローラ、ビュー、サービス、ポリシーから、モデルを create、access、modify、 destory したいかもしれない。それらを処理する方法が必要だ。
create
データベースにモデルのインスタンスを作成するために、create()
を使う。
// たとえば、
User.create({
name: 'Mike',
age: 13,
phoneNumber: '(512)-555-5555'
}).done(function(err, user) {
// エラーハンドリング
if (err) {
return console.log(err);
// User 作成に成功!
}else {
console.log("User created:", user);
}
});
find
IDでモデルを検索する場合、find(id)
を使う。求められる基準に準拠するオブジェクトを作って渡すことで検索することもできる。
// find by id の例
User.find(123).done(function(err, user) {
// エラーハンドリング
if (err) {
return console.log(err);
// User 作成は成功!
} else {
console.log("User found:", user);
}
});
// find by a criteria を実行
User.find({
name: 'Steven',
age: 32,
phone:'(210)-555-1234'
}).done(function(err, user) {
// エラーハンドリング
if (err) {
return console.log(err);
// User 作成は成功!
} else {
console.log("User found:", user);
}
});
findAll
findAll()
で、指定した基準を満たすモデルを複数検索する。最大行数のリミット(limit)や、ページングのためのスキップ(skip)、ソートを指定することもできる。戻り件数が1件であっても、array で返す。
// たとえば、このクエリは 18歳で、アルファベット順にソートしたデータを返す。
User.findAll({
age: 18
}).limit(10).sort('name ASC').done(function(err, users) {
// エラーハンドリング
if (err) {
return console.log(err);
// 複数のユーザーが見つかった!
} else {
console.log("Users found:", users);
}
});
下記に更に幾つか例を挙げる。これらの中にはクエリ修飾子(?、query modifiers)を含むものもある。
// インプットフィールドで入力したままに検索
User.findAll({
name: {
startsWith: 'thelas'
}
}, cb);
// インプットフィールドで入力したままに複数の属性を検索
User.findAll({
or: [
name: { startsWith: 'thelas' },
email: { startsWith: 'thelas' }
]
}, cb);
// キーワード検索
User.findAll({
description: {
contains: 'roller coaster'
}
}, cb);
// アルファベット順?検索
User.findAll({
name: {
'>=': 'a'
}
}, cb);
// あと、 <=, <, >, ! も使える。クエリ修飾子参照。
// アルファベット順検索、でページング付き:
// (here's page 2)
User.findAll({
where: {
name: {
'>=': 'a'
}
},
limit: 15,
skip: 15,
sort: 'name ASC'
}, cb);
dynamic finders
ビルトインの Waterline という ORM で、ダイナミックファインダーと呼ばれるとても便利なツールを使うことができる。モデルに定義した属性に応じて自動的に生成されたメソッドに対して、モデルをクエリすることができる。例えば、book モデルがあるとすると、このようになる。
var Book = {
title: 'STRING',
author: 'STRING',
publisher: 'STRING',
}
module.exports = Book;
これらのようなメソッドを用いてDBをクエリできる。
// author でクエリ
Book.findByTitle('50 Shades of Grey').done(function(err, book) {
// エラーハンドリング
if (err) {
return console.log(err);
// Book は見つかった!
} else {
console.log("Book found:", book);
}
});
// Authorで検索
Book.findAllByAuthor('John R. Erickson').done(function(err, books) {
// エラーハンドリング
if (err) {
return console.log(err);
// Book は見つかった!
} else {
console.log("Books found:", books);
}
});
update
update()
で、データベースからのモデルのインスタンスを更新できる。
// たとえば、user の name を更新する。
// .update(query, params to change, callback)
User.update({
name: 'sally'
},{
phone: '555-555-5555'
}, function(err, user) {
// エラーハンドリング
if (err) {
return console.log(err);
// 更新は成功!
} else {
console.log("User updated:", user);
}
});
destroy
destroy()
で、 データベースのモデルのインスタンスを削除することができる。
// たとえば、Johnny という Userを削除。
// first find the user
User.destroy({
name: 'Johnny',
age: 22
}).done(function(err) {
// エラーハンドリング
if (err) {
return console.log(err);
// Johnny は削除された!
} else {
console.log("User deleted");
}
});
Query Modifiers
修飾子(modifiers)は、データベースクエリで使われる。 多くのコードを書かずにデータベースから簡単に情報を取得できる。現在のところ、サポートしている修飾子は、contains
、or
、startsWith
、endsWith
、greaterThan
、lessThan
、>=
、<=
である。下記の例を参照。
Modifier: contains
contains
修飾子は、次のように使う。
where: {
name: {
contains: 'James'
}
}
Modifier: or
or
修飾子は、次のように使う。
where: {
or: [{name: 'James'}, {name: 'Mike'}]
}
name: { '>': 'a' }
What About Migrations?
(MySQLのような)スキーマフルなデータベースでは、マイグレーションは自動的になされる。デフォルトは、migrate:alter
であり、Sailsはスキーマを自動的にマイグレートしようとする。
Railsにあるような明示的なプロダクションデータのマイグレーションは、今のところ存在しない。 プロダクションデータは正確であり、手動のマイグレーションは危険である。しかしながら、もし興味のある機能であれば、課題を切って欲しい、もしくはプル・リクエストならなおいい!