Eloquent で NoSQL の精神を少しでも利用できたら素晴らしいと思いませんか?このパッケージはまさにそれを実現します。これは、モデルに適用すると、単一の JSON 列に任意の値を格納できる特性を提供します。
以下にいくつかの例を示します。ここではextra_attributes
列を使用していますが、任意の名前を付けることができます。
// add and retrieve an attribute
$ yourModel -> extra_attributes -> name = ' value ' ;
$ yourModel -> extra_attributes -> name ; // returns 'value'
// you can also use the array approach
$ yourModel -> extra_attributes [ ' name ' ] = ' value ' ;
$ yourModel -> extra_attributes [ ' name ' ] // returns 'value'
// setting multiple values in one go
$ yourModel -> extra_attributes = [
' rey ' => [ ' side ' => ' light ' ],
' snoke ' => [ ' side ' => ' dark ' ]
];
// setting/updating multiple values in one go via set()
$ yourModel -> extra_attributes -> set ([
' han ' => [ ' side ' => ' light ' ],
' snoke ' => [ ' side ' => ' dark ' ]
]);
// retrieving values using dot notation
$ yourModel -> extra_attributes -> get ( ' rey.side ' ); // returns 'light'
// retrieve default value when attribute is not exists
$ yourModel -> extra_attributes -> get ( ' non_existing ' , ' default ' ); // returns 'default'
// it has a modelScope to retrieve all models with the given schemaless attributes
$ yourModel -> withSchemalessAttributes ([ ' name ' => ' value ' , ' name2 ' => ' value2 ' ])-> get ();
// delete key & value
$ yourModel -> extra_attributes -> forget ( ' key ' );
私たちはクラス最高のオープンソース パッケージの作成に多くのリソースを投資しています。有料製品のいずれかを購入することで、私たちをサポートできます。
当社のどのパッケージを使用しているかについて、故郷から葉書を送っていただき、誠にありがとうございます。当社の住所は、お問い合わせページに記載されています。受け取ったすべてのポストカードをバーチャル ポストカード ウォールに公開します。
このパッケージには、MySQL 5.7 以降などのjson
カラムをサポートするデータベースが必要です。
Laravel バージョン 6 および 7 または PHP 7 の場合は、このパッケージのバージョン 1.x を使用してください。
パッケージは、composer 経由でインストールできます。
composer require spatie/laravel-schemaless-attributes
スキーマレス属性は、モデルのテーブルの json 列に保存されます。その列を追加してモデルを準備しましょう。
スキーマレス属性を追加するすべてのモデルに移行を追加します。列を追加するには、 Blueprint
でschemalessAttributes
メソッドを使用する必要があります。 schemalessAttributes
に指定する引数は、追加される列名です。任意の名前を使用できます。また、スキーマレス属性列をテーブルに必要な数だけ自由に追加することもできます。この Readme のすべての例では、 extra_attributes
という名前の単一の列を使用します。
Schema:: table ( ' your_models ' , function ( Blueprint $ table ) {
$ table -> schemalessAttributes ( ' extra_attributes ' );
});
スキーマレス属性を操作するには、モデルにカスタム キャストとスコープを追加する必要があります。以下は、列名としてextra_attributes
選択した場合に追加する必要があるものの例です。
use Illuminate Database Eloquent Model ;
use Illuminate Database Eloquent Builder ;
use Spatie SchemalessAttributes Casts SchemalessAttributes ;
class TestModel extends Model
{
// ...
public $ casts = [
' extra_attributes ' => SchemalessAttributes::class,
];
public function scopeWithExtraAttributes (): Builder
{
return $ this -> extra_attributes -> modelScope ();
}
// ...
}
単一モデルで複数のスキーマレス列のサポートが必要な場合は、 SchemalessAttributesTrait
特性を使用する必要があります。以下は、列名としてextra_attributes, other_extra_attributes
選択した場合に追加する必要があるものの例です。
use Illuminate Database Eloquent Model ;
use Illuminate Database Eloquent Builder ;
use Spatie SchemalessAttributes SchemalessAttributes ;
use Spatie SchemalessAttributes SchemalessAttributesTrait ;
class TestModel extends Model
{
use SchemalessAttributesTrait;
// ...
/**
* @var array
*/
protected $ schemalessAttributes = [
' extra_attributes ' ,
' other_extra_attributes ' ,
];
public function scopeWithExtraAttributes (): Builder
{
return $ this -> extra_attributes -> modelScope ();
}
public function scopeWithOtherExtraAttributes (): Builder
{
return $ this -> other_extra_attributes -> modelScope ();
}
// ...
}
この動作を複数のモデルで再利用したい場合は、関数を独自のトレイトに含めることを選択できます。その特性は次のようになります。
namespace App Models Concerns ;
use Illuminate Database Eloquent Model ;
use Illuminate Database Eloquent Builder ;
use Spatie SchemalessAttributes Casts SchemalessAttributes ;
trait HasSchemalessAttributes
{
public function initializeHasSchemalessAttributes ()
{
$ this -> casts [ ' extra_attributes ' ] = SchemalessAttributes::class;
}
public function scopeWithExtraAttributes (): Builder
{
return $ this -> extra_attributes -> modelScope ();
}
}
これは、スキーマレス属性を取得および設定する最も簡単な方法です。
$ yourModel -> extra_attributes -> name = ' value ' ;
$ yourModel -> extra_attributes -> name ; // Returns 'value'
あるいは、配列アプローチを使用することもできます。
$ yourModel -> extra_attributes [ ' name ' ] = ' value ' ;
$ yourModel -> extra_attributes [ ' name ' ]; // Returns 'value'
既存のスキーマレス属性をすべて、配列を割り当てることで置き換えることができます。
// All existing schemaless attributes will be replaced
$ yourModel -> extra_attributes = [ ' name ' => ' value ' ];
$ yourModel -> extra_attributes -> all (); // Returns ['name' => 'value']
get
とset
使用を選択することもできます。これらのメソッドはドット表記をサポートしています。
$ yourModel -> extra_attributes = [
' rey ' => [ ' side ' => ' light ' ],
' snoke ' => [ ' side ' => ' dark ' ],
];
$ yourModel -> extra_attributes -> set ( ' rey.side ' , ' dark ' );
$ yourModel -> extra_attributes -> get ( ' rey.side ' ); // Returns 'dark
get
メソッドにデフォルト値を渡すこともできます。
$ yourModel -> extra_attributes -> get ( ' non_existing ' , ' default ' ); // Returns 'default'
スキーマレス属性を永続化するには、通常の属性の場合と同様に、モデル上でsave()
を呼び出す必要があります。
$ yourModel -> save (); // Persists both normal and schemaless attributes
提供されているmodelScopeの使用方法は次のとおりです。
// Returns all models that have all the given schemaless attributes
$ yourModel -> withExtraAttributes ([ ' name ' => ' value ' , ' name2 ' => ' value2 ' ])-> get ();
単一のカスタム属性のみを検索したい場合は、次のようにmodelScopeを使用できます。
// returns all models that have a schemaless attribute `name` set to `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' value ' )-> get ();
また、カスタム演算子を使用して単一のカスタム属性のみを検索したい場合は、次のようにmodelScopeを使用できます。
// returns all models that have a schemaless attribute `name` starting with `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' LIKE ' , ' value% ' )-> get ();
ネストされたカスタム属性のみを検索したい場合は、次のようにmodelScopeを使用できます。
// returns all models that have a schemaless nested attribute `han.side` set to `light`
$ yourModel -> withExtraAttributes ( ' han->side ' , ' light ' )-> get ();
まず、 laravel_schemaless_attributes
という名前の MySQL データベースを作成します。その後、次のコマンドを使用してテストを実行できます。
composer test
最近の変更点の詳細については、CHANGELOG を参照してください。
詳細については、「貢献」を参照してください。
セキュリティの脆弱性を報告する方法については、セキュリティ ポリシーをご覧ください。
MIT ライセンス (MIT)。詳細については、ライセンス ファイルを参照してください。