Overview
このガイドでは、Lambel MongoDB を使用して Lambel Eloquet モデルを定義およびカスタマイズする方法を説明します。 Lambda Eloqueent オブジェクト関係マッパー(ORM)を使用することで、これらのモデルを使用して MongoDB データを操作できます。
次のセクションでは、Lambel MongoDB モデルに Lambel Eloqueent ORM の動作を追加する方法について説明します。
「 楕円モデル クラスの定義 」では、モデル クラスの作成方法が示されています。
「 認証可能なモデルの拡張」では、認証ユーザーとして MongoDB を設定する方法が示されています。
「 効率的なモデルクラスのカスタマイズ 」では、いくつかのモデル クラスのカスタマイズについて説明しています。
「 サードパーティ モデル クラスの拡張」では、サードパーティのモデル クラスを MongoDB と互換性を持たせるために方法について説明しています。
「プルーニング動作を指定する」では、不要になったモデルを定期的に削除する方法が示されます。
「 バージョン管理されたモデル スキーマの作成 」では、モデル スキーマのバージョン管理を実装する方法が示されています。
冗長なモデルクラスの定義
等価モデルは、データを表すクラスです。 挿入、アップデート、削除などのデータベース操作を実行するメソッドが含まれます。
Lambel MongoDB モデルを宣言するには、次のコード例に示すように、 MongoDB\Laravel\Eloquent\Modelを拡張する Laravel アプリケーションのapp/Modelsディレクトリにクラスを作成します。
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常にプライマリキー値を _idフィールドに保存します。このフィールドは、モデル内で $id としてアクセスされます。クエリ ビルダを使用すると、Lambda 統合はクエリ内の id を _id に変換します。これにより、 idフィールドを使用する他の Lambda コンポーネントとの互換性が確保されます。識別子タイプをカスタマイズするには、モデルの $keyTypeプロパティを設定し、モデルを保存する前に値を割り当てます。
認証可能なモデルを拡張する
MongoDB を Lambel ユーザー プロバイダーとして構成するには、Lambel 統合MongoDB\Laravel\Auth\Userクラスを拡張します。 次のコード例は、このクラスを拡張する方法を示しています。
namespace App\Models;
use MongoDB\Laravel\Auth\User as Authenticatable;
class User extends Authenticatable{}Lambel認証ユーザープロバイダーをカスタマイズする方法の詳細については、Lambel ドキュメントの「 カスタムユーザープロバイダーの追加 」を参照してください。
効率的なモデルクラスをカスタマイズする
このセクションでは、次の Elastic モデル動作のカスタマイズを実行する方法について説明します。
注意
Laravelのコレクションはモデルのリストを保持するPHPクラスですが、MongoDBのコレクションはデータベースにドキュメントを保存します。
MongoDBコレクションの名前を変更する
デフォルトでは、モデルはモデルクラス名のスネークケースの複数形を使用します。モデルがデータを検索および保存するために使用するコレクションの名前を変更するには、モデルクラスの $table プロパティをオーバーライドします。
注意
モデルとコレクション間の関連付けをわかりやすくするために、デフォルトのコレクション命名動作を使用することをお勧めします。
次の例では、 Planetクラスに対してカスタム MongoDB コレクション名celestial_bodyを指定します。
namespace App\Models;
use MongoDB\Laravel\Eloquent\Model;
class Planet extends Model{ protected $table = 'celestial_body';}$tableプロパティをオーバーライドせず、このモデルはplanetsコレクションにマッピングします。 オーバーライドされた プロパティを使用すると、サンプル クラスはモデルをcelestial_bodyコレクションに保存します。
ソフト削除の有効化
Elastic には、モデルのdelete()メソッドの動作を変更するソフト削除機能が含まれています。 モデルでソフト削除が有効になっている場合、 delete()メソッドはドキュメントをデータベースから削除するのではなく、削除済みとしてマークします。 deleted_atフィールドにタイムスタンプを設定して、検索操作から自動的に除外します。
クラスでソフト削除を有効にするには、次のコード例に示すようにIlluminate\Database\Eloquent\SoftDeletesトランザクションを追加します。
namespace App\Models;
use Illuminate\Database\Eloquent\SoftDeletes;use MongoDB\Laravel\Eloquent\Model;
class Planet extends Model{ use SoftDeletes;}ソフト削除が有効になっているモデルで実行できるメソッドの詳細については、Lambel ドキュメントの「効率的なソフト削除」を参照してください。
データ型のキャスト
Elastic では、キャスティング ヘルパーを使用してデータを保存または取得する前に、モデル属性データ型を変換できます。 このヘルパー メソッドは、モデルに同等のアクセス メソッドとミューテーション メソッドを定義するのに便利な代替手段です。
次の例では、キャパシティーヘルパーは、 MongoDB$\ BSONdiscovery_dt \\UTCDateTime 型としてMongoDBに保存されている モデル属性を Lambeldatetime 型に変換します。
namespace App\Models;
use MongoDB\Laravel\Eloquent\Model;
class Planet extends Model{ protected $casts = [ 'discovery_dt' => 'datetime', ];}Tip
Lambel 11のキャスト
Laravel 11 以降では、$casts 属性を使用する代わりに casts() メソッドを定義して、データ型変換を指定できます。次のコードでは、casts() メソッドを使用して、前の例と同じ変換を実行します。
protected function casts(): array{ return [ 'discovery_dt' => 'datetime', ];}詳細については、Lambda ドキュメントの属性キャスティングを参照してください。
この変換により、 PHPのDateTimeクラスを使用して、このフィールドの日付を操作できるようになります。次の例では、モデルのキャスティングヘルパーを使用して、discovery_dt が 3 年前より小さい惑星をクエリする Lambda クエリを示します。
Planet::where( 'discovery_dt', '>', new DateTime('-3 years'))->get();注意
カード日付クラス
Lambda MongoDB v5.0 以降、UTCDateTime MongoDBのBSON値は、クエリ結果のカード日付クラスとして返されます。Lambda 統合は、この変換を実行するときにデフォルトのタイムゾーンを適用します。
MongoDB データ型の詳細については、サーバー マニュアルの「BSON types」を参照してください。
Lambel キャパシティーヘルパーとサポートされているタイプの詳細については、Lalavel ドキュメントの「 属性キャパシティー 」を参照してください。
重要
Laravel MongoDB v5.8 以降、array キャストタイプは非推奨になりました。array をキャストタイプとして使用すると、属性値は MongoDB に JSON エンコードされた文字列として保存されますが、これはネイティブの BSON 形式ではありません。v5.9 以降、代わりに AsBsonArray および AsBsonDocument キャストタイプを使用できます。移行オプションを含む詳細を学ぶには、「バージョン 5.8 の非推奨事項」を参照してください。
次の例は、モデルの $casts プロパティで AsBsonDocument および AsBsonArray キャスト型を使用する方法を示しています。
use MongoDB\Laravel\Eloquent\Casts\AsBsonArray;use MongoDB\Laravel\Eloquent\Casts\AsBsonDocument;use MongoDB\Laravel\Eloquent\Model;
class BsonCasting extends Model{ protected $connection = 'mongodb'; protected $fillable = ['specs', 'variants'];
protected $casts = [ 'specs' => AsBsonDocument::class, 'variants' => AsBsonArray::class, ];}一括割り当てをカスタマイズ
Elastic では、データの配列をcreate()モデル メソッドに渡すことで、複数のモデルとその属性データを作成できます。 複数のモデルを挿入するこのプロセスは、 一括割り当て と呼ばれます。
一括割り当ては、複数のモデルを作成する効率的な方法です。 ただし、利用可能なセキュリティの脆弱性が生じる可能性があります。 フィールドのデータには、不正な権限やアクセスにつながる更新が含まれている可能性があります。
Eloquert は、一括割り当ての脆弱性からデータを保護するために、次の機能を提供します。
$fillable一括割り当てで書き込み可能なフィールドが含まれています$guarded一括割り当てで無視されるフィールドが含まれます
重要
脆弱性から保護するために、$guarded ではなく $fillable を使用することを推奨します。この推奨事項の詳細については、セキュリティ リリース: Lalavel 6.18.35、7.24.0 を参照してください。Lambda サイトの記事。
次の例では、モデルでは$fillable属性を使用してフィールドの一括割り当てが許可されています。
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特権を適用する場合は、Lambda 統合が MongoDB ObjectIdの値をstring型にキャストするため、 $keyTypeプロパティを'string'に設定する必要があります。
拡張クラスの例
この例では、 ThirdPartyPackageというパッケージからCelestialBodyクラスを拡張するPlanetモデル クラスを作成します。 PostクラスにはDocumentModel特権が含まれ、 $primaryKeyや$keyTypeなどのプロパティが定義されます。
namespace App\Models;
use MongoDB\Laravel\Eloquent\DocumentModel;use ThirdPartyPackage\CelestialBody;
class Planet extends CelestialBody{ use DocumentModel;
protected $fillable = ['name', 'diameter']; protected $keyType = 'string';}クラスを定義した後は、通常どおり MongoDB 操作を実行できます。
Tip
DocumentModel特権を使用する別の例については、ユーザー認証ガイドの「 Lambda認証 」セクションを参照してください。
プルーニング動作を指定する
不要になったモデル データを定期的に削除するための基準を指定できます。 model:pruneコマンドをスケジュールまたは実行すると、Lambda は、削除するモデルを一致させるために、 PrunableとMassPrunable特権をインポートするすべてのモデルでprunable()メソッドを呼び出します。
MongoDB をデータベースとして使用するモデルでこの機能を使用するには、適切なインポートをモデルに追加します。
Illuminate\Database\Eloquent\Prunable条件に一致するモデルを削除する前に、オプションでクリーンアップ ステップを実行しますMongoDB\Laravel\Eloquent\MassPrunableは、モデルデータを取得せずに条件に一致するモデルを削除します。
注意
一括実行可能なモデルでソフト削除を有効にする場合は、次の Lambda MongoDB パッケージをインポートする必要があります。
Illuminate\Database\Eloquent\SoftDeletesMongoDB\Laravel\Eloquent\MassPrunable
プルーニング機能の詳細については、Lambel ドキュメントのプルーニング モデルを参照してください。
実行可能な例
次のプル可能なクラスには、プルーニング アクションが削除するモデルに一致するprunable()メソッドと、一致するモデルを削除する前に実行されるpruning()メソッドが含まれています。
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()メソッドが含まれています。
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); }}バージョン管理されたモデルスキーマの作成
Eloquentモデルで HasSchemaVersion トレイトを使用することで、アプリケーションにスキーマバージョニングパスワードなしを実装するできます。異なるスキーマを持つデータを含むMongoDBコレクションを整理または標準化するために、スキーマバージョンを実装することを選択できます。
Tip
スキーマのバージョン管理の詳細については、サーバー マニュアルの「スキーマのバージョン管理のためのモデルデータ 」チュートリアルを参照してください。
MongoDBをデータベースとして使用するモデルでこの機能を使用するには、MongoDB\Laravel\Eloquent\HasSchemaVersionインポートをモデルに追加します。次に、SCHEMA_VERSION定数を1に設定して、MongoDBコレクションの最初のスキーマバージョンを設定します。コレクションが進化して複数のスキーマが含まれるようになった場合は、後続のモデルクラスでSCHEMA_VERSION定数の値を更新できます。
モデルを作成する際、モデルを取得するときに現在のスキーマ バージョンへの移行を指定するためのmigrateSchema()メソッドを定義できます。 このメソッドでは、古いモデルに加える変更を指定して、現在のスキーマ バージョンと一致するようにモデルを更新できます。
スキーマ バージョンが指定されていないモデルを保存すると、 HasSchemaVersion特権は最新のスキーマ バージョンに準拠していると想定します。 schema_versionフィールドを含まないモデルを検索すると、trait はスキーマ バージョンが0であると想定し、移行を実行します。
スキーマのバージョン管理の例
このサンプルの状況では、次のクラスによって最初にモデル化されたMongoDBコレクションを操作します。
namespace App\Models;
use MongoDB\Laravel\Eloquent\Model;
class Planet extends Model{ protected $fillable = ['name', 'type'];}次に、MongoDB コレクションに新しいスキーマバージョンを実装する。新しいモデルクラスを次の動作で定義できます。
HasSchemaVersion特権を実装し、現在のSCHEMA_VERSIONを2に設定しますスキーマ バージョンが
2未満のモデルを'Milky Way'の値を持つgalaxyフィールドに移行するためのmigrateSchema()メソッドを定義します。
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 統合は保存時に現在のスキーマ バージョンをそのドキュメントに割り当てます。
最後に、コードはMongoDBコレクションからモデルを検索し、変更内容をデモンストレーションします。
// Simulates a document in the collection with schema version 1Planet::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();