コレクション(collection)はコンテンツタイプ(投稿、ページ、製品)です。そのフィールド定義により、各エントリのデータ構造が設定されます。
コレクションの作成
管理パネルのコンテンツタイプでコレクションを作成します。各コレクションには次のプロパティがあります:
| プロパティ | 説明 |
|---|---|
slug | URL安全な識別子(例:posts、products) |
label | 表示名(例:「ブログ投稿」) |
labelSingular | 単数形(例:「投稿」) |
description | エディター向けオプション説明 |
icon | 管理サイドバー用のLucideアイコン名 |
supports | 下書き、リビジョン、プレビュー、スケジュール、検索、SEOなどの機能 |
コレクション機能
コレクションを作成する際、必要な機能を有効にします:
| 機能 | 説明 |
|---|---|
drafts | 下書き/公開ワークフローを有効化 |
revisions | バージョンスナップショットでコンテンツ履歴を追跡 |
preview | 下書きコンテンツの署名付きプレビューURLを生成 |
scheduling | 将来の日付でコンテンツ公開をスケジュール |
次のコレクションは4つの機能すべてを有効にします:
{
slug: "posts",
label: "Blog Posts",
labelSingular: "Post",
supports: ["drafts", "revisions", "preview", "scheduling"]
}
フィールドタイプ
EmDashは、SQLite列タイプにマップされる16のフィールドタイプをサポートしています。
テキストフィールド
string
短いテキスト入力。TEXT列にマップされます。
{ slug: "title", type: "string", label: "Title" } text
複数行テキストエリア。TEXT列にマップされます。
{ slug: "excerpt", type: "text", label: "Excerpt" } slug
URL安全なスラグフィールド。TEXT列にマップされます。
{ slug: "handle", type: "slug", label: "URL Handle" } リッチコンテンツ
portableText
リッチテキストエディター(TipTap/ProseMirror)。JSONとして保存されます。
{ slug: "content", type: "portableText", label: "Content" }Portable Textは、HTMLを埋め込まずに構造を保持するブロックベースの形式です。
json
任意のJSONデータ。JSONとして保存されます。
{ slug: "metadata", type: "json", label: "Custom Metadata" } 数値
number
10進数。REAL列にマップされます。
{ slug: "price", type: "number", label: "Price" } integer
整数。INTEGER列にマップされます。
{ slug: "quantity", type: "integer", label: "Stock Quantity" } ブール値と日付
boolean
真/偽トグル。INTEGER(0/1)にマップされます。
{ slug: "featured", type: "boolean", label: "Featured Post" } datetime
日付と時刻のピッカー。ISO 8601文字列として保存されます。
{ slug: "eventDate", type: "datetime", label: "Event Date" } 選択
select
リストから単一オプション。TEXT列にマップされます。
{
slug: "status",
type: "select",
label: "Product Status",
validation: {
options: ["active", "discontinued", "coming_soon"]
}
} multiSelect
リストから複数オプション。JSON配列として保存されます。
{
slug: "features",
type: "multiSelect",
label: "Product Features",
validation: {
options: ["wireless", "waterproof", "eco-friendly"]
}
} メディアと参照
image
メディアライブラリからの画像ピッカー。メディアIDをTEXTとして保存します。
{ slug: "featuredImage", type: "image", label: "Featured Image" } file
メディアライブラリからのファイルピッカー。メディアIDをTEXTとして保存します。
{ slug: "attachment", type: "file", label: "PDF Attachment" } reference
別のコレクションのエントリへの参照。エントリIDをTEXTとして保存します。
{
slug: "author",
type: "reference",
label: "Author",
options: {
collection: "authors"
}
} フィールドプロパティ
各フィールドは次のプロパティをサポートします:
| プロパティ | タイプ | 説明 |
|---|---|---|
slug | string | データベースの列名 |
label | string | 管理UIの表示ラベル |
type | FieldType | 16のフィールドタイプのいずれか |
required | boolean | フィールドに値が必要かどうか |
unique | boolean | 値がエントリ間で一意である必要があるかどうか |
defaultValue | unknown | 新しいエントリのデフォルト値 |
validation | object | タイプ固有の検証ルール |
widget | string | カスタムウィジェット識別子 |
options | object | ウィジェット固有の設定 |
sortOrder | number | エディターでの表示順序 |
検証ルール
validationオブジェクトはフィールドタイプによって異なります。完全な形式は次のとおりです:
interface FieldValidation {
required?: boolean; // All types
min?: number; // number, integer
max?: number; // number, integer
minLength?: number; // string, text
maxLength?: number; // string, text
pattern?: string; // string (regex)
options?: string[]; // select, multiSelect
}
次のフィールドは、パターンに一致する一意のメールアドレスを必要とします:
{
slug: "email",
type: "string",
label: "Email Address",
required: true,
unique: true,
validation: {
pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
}
}
ウィジェットオプション
optionsオブジェクトは、フィールド固有のUI動作を構成します。完全な形式は次のとおりです:
interface FieldWidgetOptions {
rows?: number; // text (textarea rows)
showPreview?: boolean; // image, file
collection?: string; // reference (target collection)
allowMultiple?: boolean; // reference (multiple refs)
[key: string]: unknown; // Custom widget options
}
次の参照フィールドは複数の製品をリンクします:
{
slug: "relatedProducts",
type: "reference",
label: "Related Products",
options: {
collection: "products",
allowMultiple: true
}
}
コレクションのクエリ
提供されているクエリ関数を使用してコンテンツを取得します。これらはAstroのライブコレクションパターンに従い、構造化された結果を返します。次の例は一般的なクエリオプションを示しています:
import { getEmDashCollection, getEmDashEntry } from "emdash";
// Get all entries - returns { entries, error }
const { entries: posts } = await getEmDashCollection("posts");
// Filter by status
const { entries: drafts } = await getEmDashCollection("posts", {
status: "draft",
});
// Limit results
const { entries: recent } = await getEmDashCollection("posts", {
limit: 5,
});
// Filter by taxonomy
const { entries: newsPosts } = await getEmDashCollection("posts", {
where: { category: "news" },
});
// Get a single entry by slug - returns { entry, error, isPreview }
const { entry: post } = await getEmDashEntry("posts", "my-post-slug");
// Handle errors
const { entries, error } = await getEmDashCollection("posts");
if (error) {
console.error("Failed to load posts:", error);
}
型生成
npx emdash typesを実行して、スキーマからTypeScript型を生成します。生成されたファイルには、コレクションごとに1つのインターフェイスが含まれます:
export interface Post {
title: string;
content: PortableTextBlock[];
excerpt?: string;
featuredImage?: string;
author: string; // reference ID
}
export interface Product {
title: string;
price: number;
description: PortableTextBlock[];
}
データベースマッピング
フィールドタイプは次のようにSQLite列タイプにマップされます:
| フィールドタイプ | SQLiteタイプ | 注記 |
|---|---|---|
string | TEXT | |
text | TEXT | |
slug | TEXT | |
url | TEXT | |
number | REAL | 64ビット浮動小数点 |
integer | INTEGER | 64ビット符号付き整数 |
boolean | INTEGER | 0または1 |
datetime | TEXT | ISO 8601形式 |
select | TEXT | |
multiSelect | JSON | 文字列配列 |
portableText | JSON | ブロック配列 |
image | TEXT | メディアID |
file | TEXT | メディアID |
reference | TEXT | エントリID |
json | JSON | 任意のJSON |
repeater | JSON | サブフィールドの配列 |