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コンソールの詳細については、 Atlas コンソール を参照してくださいDocs ( Lambda の )。

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

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

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

Lambda 認証ユーザー プロバイダーをカスタマイズする方法の詳細については、「 カスタム ユーザー プロバイダーの追加Docs 」を参照してください。 ( Lambda の )。

このセクションでは、次の 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';
}

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

_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;
}

ソフト削除が有効になっているモデルで実行できる方法の詳細については、「 一括削除 」 を参照してください。 ( LambdaDocs の )。

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 を使用できるようになります このフィールドの日付を操作するクラス。次の例では、モデルのキャスティング ヘルパーを使用して、 discovery_dtが 3 年前より小さい惑星をクエリする Lambda クエリを示します。

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

注意

カード日付クラス

Lambda MongoDB v 5.0以降、 UTCDateTimeMongoDB の BSON 値はLongとして返されます クエリ結果内の日付クラス。Lambda 統合は、この変換を実行するときにデフォルトのタイムゾーンを適用します。

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

Lambda のキャスティング ヘルパーとサポートされているタイプの詳細については、「 属性キャスティング Docs」を参照してください。 ( Lambda の )。

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

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

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

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

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

重要

脆弱性から保護するために、 ではなく を使用することを推奨します。$fillable$guardedこの推奨事項の詳細については、 セキュリティ リリース: Lalavel6.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属性から が省略されているため、 フィールドと フィールドのみが含まれます。

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

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

モデル クラスにDocumentModel特権を適用する場合は、Lambda 統合が MongoDB ObjectIdの値をstring型にキャストするため、 $keyTypeプロパティを'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 $keyType = 'string';
}

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

Tip

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

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

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

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

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

注意

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

  • MongoDB\Laravel\Eloquent\SoftDeletes

  • MongoDB\Laravel\Eloquent\MassPrunable

プルーニング機能について詳しくは、「 プルーニング モデル Docs」を参照してください。 ( Lambda の )。

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

<?php
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()メソッドが含まれています。

<?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,
}
]