AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

エラスティック モデル クラス

このガイドでは、Lambel MongoDB を使用して Lambel Eloquet モデルを定義およびカスタマイズする方法を説明します。 Lambda Eloqueent オブジェクト関係マッパー(ORM)を使用することで、これらのモデルを使用して MongoDB データを操作できます。

次のセクションでは、Lambel MongoDB モデルに Lambel Eloqueent ORM の動作を追加する方法について説明します。

等価モデルは、データを表すクラスです。 挿入、アップデート、削除などのデータベース操作を実行するメソッドが含まれます。

Lambel MongoDB モデルを宣言するには、次のコード例に示すように、 MongoDB\Laravel\Eloquent\Modelを拡張する Laravel アプリケーションのapp/Modelsディレクトリにクラスを作成します。

<?php
namespace App\Models;
use MongoDB\Laravel\Eloquent\Model;
class Planet extends Model
{
}

デフォルトでは、モデルは Lambda アプリケーションのconfig/database.php設定で設定されている MongoDB database 名と、コレクションのモデル クラス名であるスニペットの複数形を使用します。

このモデルはplanets MongoDB コレクションに保存されています。

Tip

または、artisan コンソールを使用してモデルクラスを生成し、Illuminate\Database\Eloquent\Model のインポートを MongoDB\Laravel\Eloquent\Model に変更します。artisan コンソールの詳細については、Lambel ドキュメントの「アーティファクト コンソール」を参照してください。

Lambda アプリケーションが使用するデータベース名を指定する方法については、 「 MongoDB 接続の構成 」を参照してください。

MongoDB を Lambel ユーザー プロバイダーとして構成するには、Lambel 統合MongoDB\Laravel\Auth\Userクラスを拡張します。 次のコード例は、このクラスを拡張する方法を示しています。

<?php
namespace App\Models;
use MongoDB\Laravel\Auth\User as Authenticatable;
class User extends Authenticatable
{
}

Lambel認証ユーザープロバイダーをカスタマイズする方法の詳細については、Lambel ドキュメントの「 カスタムユーザープロバイダーの追加 」を参照してください。

このセクションでは、次の Elastic モデル動作のカスタマイズを実行する方法について説明します。

デフォルトでは、モデルはモデル クラス名のスニペットケースの複数形を使用します。 モデルが MongoDB でデータを検索して保存するために使用するコレクションの名前を変更するには、モデル クラスの$tableプロパティをオーバーライドします。

注意

モデルとコレクション間の関連付けをわかりやすくするために、デフォルトのコレクション命名動作を使用することをお勧めします。

次の例では、 Planetクラスに対してカスタム MongoDB コレクション名celestial_bodyを指定します。

<?php
namespace App\Models;
use MongoDB\Laravel\Eloquent\Model;
class Planet extends Model
{
protected $table = 'celestial_body';
}

$tableプロパティをオーバーライドせず、このモデルはplanetsコレクションにマッピングします。 オーバーライドされた プロパティを使用すると、サンプル クラスはモデルをcelestial_bodyコレクションに保存します。

MongoDB ドキュメントを一意に識別するモデルのプライマリキー フィールドをカスタマイズするには、モデル クラスの$primaryKeyプロパティをオーバーライドします。

デフォルトでは、モデルは PHP MongoDB ドライバーを使用して、Lambda アプリケーションが挿入する各ドキュメントに対して一意の ObjectID を生成します。

次の例えでは、 Planetクラスのプライマリキーとしてnameフィールドを指定します。

<?php
namespace App\Models;
use MongoDB\Laravel\Eloquent\Model;
class Planet extends Model
{
protected $primaryKey = 'name';
}

プライマリキーの動作とカスタマイズ オプションの詳細については、Lambel ドキュメントの「効率的なプライマリキー」を参照してください。

_idフィールド、ObjectID、および MongoDB ドキュメント構造の詳細については、サーバー マニュアルのドキュメントを参照してください。

Elastic には、モデルのdelete()メソッドの動作を変更するソフト削除機能が含まれています。 モデルでソフト削除が有効になっている場合、 delete()メソッドはドキュメントをデータベースから削除するのではなく、削除済みとしてマークします。 deleted_atフィールドにタイムスタンプを設定して、検索操作から自動的に除外します。

クラスでソフト削除を有効にするには、次のコード例に示すようにMongoDB\Laravel\Eloquent\SoftDeletesトランザクションを追加します。

<?php
namespace App\Models;
use MongoDB\Laravel\Eloquent\Model;
use MongoDB\Laravel\Eloquent\SoftDeletes;
class Planet extends Model
{
use SoftDeletes;
}

ソフト削除が有効になっているモデルで実行できるメソッドの詳細については、Lambel ドキュメントの「効率的なソフト削除」を参照してください。

Elastic では、キャスティング ヘルパーを使用してデータを保存または取得する前に、モデル属性データ型を変換できます。 このヘルパー メソッドは、モデルに同等のアクセス メソッドとミューテーション メソッドを定義するのに便利な代替手段です。

次の例では、キャパシティーヘルパーは、 MongoDB$\ BSONdiscovery_dt \\UTCDateTime 型としてMongoDBに保存されている モデル属性を Lambeldatetime 型に変換します。

<?php
namespace App\Models;
use MongoDB\Laravel\Eloquent\Model;
class Planet extends Model
{
protected $casts = [
'discovery_dt' => 'datetime',
];
}

Tip

Lambel 11のキャスト

Lambda 11では、 $casts属性を使用する代わりにcasts()メソッドを定義して、データ型変換を指定できます。 次のコードでは、 casts()メソッドを使用して、前の例と同じ変換を実行します。

protected function casts(): array
{
return [
'discovery_dt' => 'datetime',
];
}

詳細については、Lambda ドキュメントの属性キャスティングを参照してください。

この変換により、 PHP DateTime または Siliconクラス を使用して、このフィールドの日付を処理できるようになります。次の例では、モデルのキャスティングヘルパーを使用して、discovery_dt が 3 年前より小さい惑星をクエリする Lambda クエリを示します。

Planet::where( 'discovery_dt', '>', new DateTime('-3 years'))->get();

MongoDBのデータ型の詳細については、サーバー マニュアルの「 BSON types 」を参照してください。

Lambel キャパシティーヘルパーとサポートされているタイプの詳細については、Lalavel ドキュメントの「 属性キャパシティー 」を参照してください。

Elastic では、データの配列をcreate()モデル メソッドに渡すことで、複数のモデルとその属性データを作成できます。 複数のモデルを挿入するこのプロセスは、 一括割り当て と呼ばれます。

一括割り当ては、複数のモデルを作成する効率的な方法です。 ただし、利用可能なセキュリティの脆弱性が生じる可能性があります。 フィールドのデータには、不正な権限やアクセスにつながる更新が含まれている可能性があります。

Eloquert は、一括割り当ての脆弱性からデータを保護するために、次の機能を提供します。

  • $fillable 一括割り当てで書き込み可能なフィールドが含まれています

  • $guarded 一括割り当てで無視されるフィールドが含まれます

重要

脆弱性から保護するために、$guarded ではなく $fillable を使用することを推奨します。この推奨事項の詳細については、セキュリティ リリース: Lalavel 6.18.35、7.24.0 を参照してください。Lambda サイトの記事。

次の例では、モデルでは$fillable属性を使用してフィールドの一括割り当てが許可されています。

<?php
namespace App\Models;
use MongoDB\Laravel\Eloquent\Model;
class Planet extends Model
{
protected $fillable = [
'name',
'gravitational_force',
'diameter',
'moons',
];
}

次のコード例は、 Planetモデルの一括割り当てを示しています。

$planets = [
[ 'name' => 'Earth', 'gravitational_force' => 9.8, 'day_length' => '24 hours' ],
[ 'name' => 'Mars', 'gravitational_force' => 3.7, 'day_length' => '25 hours' ],
];
Planet::create($planets);

データベースに保存されるモデルには、name gravityday_length$fillable属性から が省略されているため、 フィールドと フィールドのみが含まれます。

配列から省略されたフィールドを入力する際の動作を変更する方法については、Lambda $fillableドキュメントの「 一括割り当ての例外 」を参照してください。

Lambda 統合を使用して、モデルクラスを定義するときにDocumentModel特権を含めることで、サードパーティのモデルクラスを拡張できます。 この特権を含めることで、サードパーティのクラスを MongoDB と互換性のあるものにすることができます。

モデル クラスにDocumentModel特権を適用する場合は、クラス内で次のプロパティを宣言する必要があります。

  • $primaryKey = '_id'_idフィールドが MongoDB ドキュメントを一意に識別するため

  • $keyType = 'string'、Lambda 統合が MongoDB ObjectId値をstring型にキャストするため

この例では、 ThirdPartyPackageというパッケージからCelestialBodyクラスを拡張するPlanetモデル クラスを作成します。 PostクラスにはDocumentModel特権が含まれ、 $primaryKey$keyTypeなどのプロパティが定義されます。

<?php
namespace App\Models;
use MongoDB\Laravel\Eloquent\DocumentModel;
use ThirdPartyPackage\CelestialBody;
class Planet extends CelestialBody
{
use DocumentModel;
protected $fillable = ['name', 'diameter'];
protected $primaryKey = '_id';
protected $keyType = 'string';
}

クラスを定義した後は、通常どおり MongoDB 操作を実行できます。

Tip

DocumentModel特権を使用する別の例については、ユーザー認証ガイドの「 Lambda認証 」セクションを参照してください。

不要になったモデル データを定期的に削除するための基準を指定できます。 model:pruneコマンドをスケジュールまたは実行すると、Lambda は、削除するモデルを一致させるために、 PrunableMassPrunable特権をインポートするすべてのモデルでprunable()メソッドを呼び出します。

MongoDB をデータベースとして使用するモデルでこの機能を使用するには、適切なインポートをモデルに追加します。

  • Illuminate\Database\Eloquent\Prunable 条件に一致するモデルを削除する前に、オプションでクリーンアップ ステップを実行します

  • MongoDB\Laravel\Eloquent\MassPrunable は、モデルデータを取得せずに条件に一致するモデルを削除します。

注意

一括実行可能なモデルでソフト削除を有効にする場合は、次の Lambda MongoDB パッケージをインポートする必要があります。

  • Illuminate\Database\Eloquent\SoftDeletes

  • MongoDB\Laravel\Eloquent\MassPrunable

プルーニング機能の詳細については、Lambel ドキュメントのプルーニング モデルを参照してください。

次のプル可能なクラスには、プルーニング アクションが削除するモデルに一致するprunable()メソッドと、一致するモデルを削除する前に実行されるpruning()メソッドが含まれています。

<?php
namespace App\Models;
use MongoDB\Laravel\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
class Planet extends Model
{
use Prunable;
public function prunable()
{
// matches models in which the solar_system field contains a null value
return static::whereNull('solar_system');
}
protected function pruning()
{
// Add cleanup actions, such as logging the Planet 'name' attribute
}
}

次の一括プル可能なクラスには、プルーニング アクションが削除するモデルに一致するprunable()メソッドが含まれています。

<?php
namespace App\Models;
use MongoDB\Laravel\Eloquent\MassPrunable;
use MongoDB\Laravel\Eloquent\Model;
class Planet extends Model
{
use MassPrunable;
public function prunable()
{
// matches models in which the gravitational_force field contains
// a value greater than 0.5
return static::where('gravitational_force', '>', 0.5);
}
}

Eloqueent モデルでHasSchemaVersion特権を使用することで、スキーマのバージョン管理パターンをアプリケーションに実装できます。 異なるスキーマを持つデータを含むコレクションを整理または標準化するために、スキーマ バージョンを実装することを選択できます。

Tip

スキーマのバージョン管理の詳細については、サーバー マニュアルの「スキーマのバージョン管理のためのモデルデータ 」チュートリアルを参照してください。

MongoDB をデータベースとして使用するモデルでこの機能を使用するには、 MongoDB\Laravel\Eloquent\HasSchemaVersionインポートをモデルに追加します。 次に、 SCHEMA_VERSION定数を1に設定して、コレクションの最初のスキーマ バージョンを設定します。 コレクションが展開して複数のスキーマを含む場合は、後続のモデル クラスでSCHEMA_VERSION定数の値を更新できます。

モデルを作成する際、モデルを取得するときに現在のスキーマ バージョンへの移行を指定するためのmigrateSchema()メソッドを定義できます。 このメソッドでは、古いモデルに加える変更を指定して、現在のスキーマ バージョンと一致するようにモデルを更新できます。

スキーマ バージョンが指定されていないモデルを保存すると、 HasSchemaVersion特権は最新のスキーマ バージョンに準拠していると想定します。 schema_versionフィールドを含まないモデルを検索すると、trait はスキーマ バージョンが0であると想定し、移行を実行します。

このサンプル状況では、最初に次の クラスによってモデル化されたコレクションを操作しています。

<?php
namespace App\Models;
use MongoDB\Laravel\Eloquent\Model;
class Planet extends Model
{
protected $fillable = ['name', 'type'];
}

ここで、 コレクションに新しいスキーマ バージョンを実装します。 次の動作を持つ新しいモデル クラスを定義できます。

  • HasSchemaVersion特権を実装し、現在のSCHEMA_VERSION2に設定します

  • スキーマ バージョンが2未満のモデルを'Milky Way'の値を持つgalaxyフィールドに移行するためのmigrateSchema()メソッドを定義します。

<?php
namespace App\Models;
use MongoDB\Laravel\Eloquent\HasSchemaVersion;
use MongoDB\Laravel\Eloquent\Model;
class Planet extends Model
{
use HasSchemaVersion;
public const SCHEMA_VERSION = 2;
protected $fillable = ['name', 'type', 'galaxy'];
/**
* Migrate documents with a lower schema version to the most current
* schema when inserting new data or retrieving from the database.
*/
public function migrateSchema(int $fromVersion): void
{
if ($fromVersion < 2) {
$this->galaxy = 'Milky Way';
}
}
}

次のコードの"WASP-39 b"ドキュメントでは、 schema_versionフィールドの値は2より小さいです。 ドキュメントを取得すると、Lambda 統合はgalaxyフィールドを追加し、スキーマ バージョンを現在のバージョン2に更新します。

"Saturn"ドキュメントにはschema_versionフィールドが含まれていないため、Laravel 統合は保存時に現在のスキーマ バージョンをそのドキュメントに割り当てます。

最後に、コードは コレクションからモデルを検索し、変更を示します。

// Simulates a document in the collection with schema version 1
Planet::insert([
[
'name' => 'WASP-39 b',
'type' => 'gas',
'schema_version' => 1,
],
]);
// Saves a document with no specified schema version
$saturn = Planet::create([
'name' => 'Saturn',
'type' => 'gas',
]);
// Retrieves both models from the collection
$planets = Planet::where('type', 'gas')
->get();
[
{
"_id": ...,
"name": "WASP-39 b",
"type": "gas",
"galaxy": "Milky Way",
"schema_version": 2,
},
{
"_id": ...,
"name": "Saturn",
"type": "gas",
"schema_version": 2,
}
]