エラスティック モデル クラス
項目一覧
Overview
このガイドでは、Lambel MongoDB を使用して Lambel Eloquet モデルを定義およびカスタマイズする方法を説明します。 Lambda Eloqueent オブジェクト関係マッパー(ORM)を使用することで、これらのモデルを使用して MongoDB データを操作できます。
次のセクションでは、Lambel MongoDB モデルに Lambel Eloqueent ORM の動作を追加する方法について説明します。
「 楕円モデル クラスの定義 」では、モデル クラスの作成方法が示されています。
「 認証可能なモデルの拡張」では、認証ユーザーとして MongoDB を設定する方法が示されています。
「 効率的なモデルクラスのカスタマイズ 」では、いくつかのモデル クラスのカスタマイズについて説明しています。
「 サードパーティ モデル クラスの拡張」では、サードパーティのモデル クラスを MongoDB と互換性を持たせるために方法について説明しています。
「プルーニング動作を指定する」では、不要になったモデルを定期的に削除する方法が示されます。
「 バージョン管理されたモデル スキーマの作成 」では、モデル スキーマのバージョン管理を実装する方法が示されています。
冗長なモデルクラスの定義
等価モデルは、データを表すクラスです。 挿入、アップデート、削除などのデータベース操作を実行するメソッドが含まれます。
Lambda MongoDB モデルを宣言するには、次のコード例に示すように、 MongoDB\Laravel\Eloquent\Model
を拡張する Lambda アプリケーションの 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
に変更します。コンソールの詳細については、 Lambda ドキュメント のartisan
アーティファクト コンソールDocs を参照してください。
Lambda アプリケーションが使用するデータベース名を指定する方法については、「 MongoDB 接続の構成 」を参照してください。
認証可能なモデルを拡張する
MongoDB を Lambel ユーザー プロバイダーとして構成するには、Lambel 統合MongoDB\Laravel\Auth\User
クラスを拡張します。 次のコード例は、このクラスを拡張する方法を示しています。
namespace App\Models; use MongoDB\Laravel\Auth\User as Authenticatable; class User extends Authenticatable { }
Lambda 認証ユーザー プロバイダーをカスタマイズする方法の詳細については、「 カスタム ユーザー プロバイダーの追加Docs 」を参照してください。 ( Lambda の )。
効率的なモデルクラスをカスタマイズする
このセクションでは、次の Elastic モデル動作のカスタマイズを実行する方法について説明します。
モデル コレクション名の変更
デフォルトでは、モデルはモデル クラス名のスニペットケースの複数形を使用します。 モデルが 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
コレクションに保存します。
プライマリキー フィールドの変更
MongoDB ドキュメントを一意に識別するモデルのプライマリキー フィールドをカスタマイズするには、モデル クラスの$primaryKey
プロパティをオーバーライドします。
デフォルトでは、モデルは PHP MongoDB ドライバーを使用して、Lambda アプリケーションが挿入する各ドキュメントに対して一意の ObjectID を生成します。
次の例えでは、 Planet
クラスのプライマリキーとしてname
フィールドを指定します。
namespace App\Models; use MongoDB\Laravel\Eloquent\Model; class Planet extends Model { protected $primaryKey = 'name'; }
プライマリキーの動作とカスタマイズ オプションの詳細については、「 効率的な プライマリ キーDocs 」を参照してください。 ( Lambda の )。
_id
フィールド、ObjectID、および MongoDB ドキュメント構造の詳細については、サーバー マニュアルのドキュメントを参照してください。
ソフト削除の有効化
Elastic には、モデルのdelete()
メソッドの動作を変更するソフト削除機能が含まれています。 モデルでソフト削除が有効になっている場合、 delete()
メソッドはドキュメントをデータベースから削除するのではなく、削除済みとしてマークします。 deleted_at
フィールドにタイムスタンプを設定して、検索操作から自動的に除外します。
クラスでソフト削除を有効にするには、次のコード例に示すようにMongoDB\Laravel\Eloquent\SoftDeletes
トランザクションを追加します。
namespace App\Models; use MongoDB\Laravel\Eloquent\Model; use MongoDB\Laravel\Eloquent\SoftDeletes; class Planet extends Model { use SoftDeletes; }
ソフト削除が有効になっているモデルで実行できる方法の詳細については、「 一括削除 」 を参照してください。 ( LambdaDocs の )。
データ型のキャスト
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のキャスト
Lambda 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();
MongoDBのデータ型の詳細については、サーバー マニュアルの「 BSON types 」を参照してください。
Lambda のキャスティング ヘルパーとサポートされているタイプの詳細については、「 属性キャスティング Docs」を参照してください。 ( Lambda の )。
一括割り当てをカスタマイズ
Elastic では、データの配列をcreate()
モデル メソッドに渡すことで、複数のモデルとその属性データを作成できます。 複数のモデルを挿入するこのプロセスは、 一括割り当て と呼ばれます。
一括割り当ては、複数のモデルを作成する効率的な方法です。 ただし、利用可能なセキュリティの脆弱性が生じる可能性があります。 フィールドのデータには、不正な権限やアクセスにつながる更新が含まれている可能性があります。
Eloquert は、一括割り当ての脆弱性からデータを保護するために、次の機能を提供します。
$fillable
一括割り当てで書き込み可能なフィールドが含まれています$guarded
一括割り当てで無視されるフィールドが含まれます
重要
脆弱性から保護するために、 ではなく を使用することを推奨します。$fillable
$guarded
この推奨事項の詳細については、 セキュリティ リリース: Lalavel6.18.35 、7.24 を参照してください。0Lambda サイトの記事。
次の例では、モデルでは$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
gravity
day_length
$fillable
属性から が省略されているため、 フィールドと フィールドのみが含まれます。
配列から省略されたフィールドを入力しようとする際の動作を変更する方法については、「$fillable
一括割り当て例外 」を参照してください。 ( LambdaDocs の )。
サードパーティのモデルクラス拡張
Lambda 統合を使用して、モデルクラスを定義するときにDocumentModel
特権を含めることで、サードパーティのモデルクラスを拡張できます。 この特権を含めることで、サードパーティのクラスを MongoDB と互換性のあるものにすることができます。
モデル クラスにDocumentModel
特権を適用する場合は、クラス内で次のプロパティを宣言する必要があります。
$primaryKey = '_id'
、_id
フィールドが MongoDB ドキュメントを一意に識別するため$keyType = 'string'
、Lambda 統合が MongoDBObjectId
値を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 $primaryKey = '_id'; protected $keyType = 'string'; }
クラスを定義した後は、通常どおり MongoDB 操作を実行できます。
Tip
DocumentModel
特権を使用する別の例については、ユーザー認証ガイドの「 Lambda認証 」セクションを参照してください。
プルーニング動作を指定する
不要になったモデル データを定期的に削除するための基準を指定できます。 model:prune
コマンドをスケジュールまたは実行すると、Lambda は、削除するモデルを一致させるために、 Prunable
とMassPrunable
特権をインポートするすべてのモデルでprunable()
メソッドを呼び出します。
MongoDB をデータベースとして使用するモデルでこの機能を使用するには、適切なインポートをモデルに追加します。
MongoDB\Laravel\Eloquent\Prunable
条件に一致するモデルを削除する前に、オプションでクリーンアップ ステップを実行しますMongoDB\Laravel\Eloquent\MassPrunable
は、モデルデータを取得せずに条件に一致するモデルを削除します。
注意
一括実行可能なモデルでソフト削除を有効にする場合は、次の Lambda MongoDB パッケージをインポートする必要があります。
MongoDB\Laravel\Eloquent\SoftDeletes
MongoDB\Laravel\Eloquent\MassPrunable
プルーニング機能について詳しくは、「 プルーニング モデル Docs」を参照してください。 ( Lambda の )。
実行可能な例
次のプル可能なクラスには、プルーニング アクションが削除するモデルに一致するprunable()
メソッドと、一致するモデルを削除する前に実行されるpruning()
メソッドが含まれています。
namespace App\Models; use MongoDB\Laravel\Eloquent\Model; use MongoDB\Laravel\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); } }
バージョン管理されたモデルスキーマの作成
Eloqueent モデルでHasSchemaVersion
特権を使用することで、スキーマのバージョン管理パターンをアプリケーションに実装できます。 異なるスキーマを持つデータを含むコレクションを整理または標準化するために、スキーマ バージョンを実装することを選択できます。
Tip
スキーマのバージョン管理の詳細については、サーバー マニュアルの「スキーマのバージョン管理のためのモデルデータ 」チュートリアルを参照してください。
MongoDB をデータベースとして使用するモデルでこの機能を使用するには、 MongoDB\Laravel\Eloquent\HasSchemaVersion
インポートをモデルに追加します。 次に、 SCHEMA_VERSION
定数を1
に設定して、コレクションの最初のスキーマ バージョンを設定します。 コレクションが展開して複数のスキーマを含む場合は、後続のモデル クラスでSCHEMA_VERSION
定数の値を更新できます。
モデルを作成する際、モデルを取得するときに現在のスキーマ バージョンへの移行を指定するためのmigrateSchema()
メソッドを定義できます。 このメソッドでは、古いモデルに加える変更を指定して、現在のスキーマ バージョンと一致するようにモデルを更新できます。
スキーマ バージョンが指定されていないモデルを保存すると、 HasSchemaVersion
特権は最新のスキーマ バージョンに準拠していると想定します。 schema_version
フィールドを含まないモデルを検索すると、trait はスキーマ バージョンが0
であると想定し、移行を実行します。
スキーマのバージョン管理の例
このサンプル状況では、最初に次の クラスによってモデル化されたコレクションを操作しています。
namespace App\Models; use MongoDB\Laravel\Eloquent\Model; class Planet extends Model { protected $fillable = ['name', 'type']; }
ここで、 コレクションに新しいスキーマ バージョンを実装します。 次の動作を持つ新しいモデル クラスを定義できます。
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 統合は保存時に現在のスキーマ バージョンをそのドキュメントに割り当てます。
最後に、コードは コレクションからモデルを検索し、変更を示します。
// 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, } ]