如果您能在 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 ' );
我們投入了大量資源來創建一流的開源套件。您可以透過購買我們的一款付費產品來支持我們。
我們非常感謝您從家鄉寄給我們一張明信片,並註明您正在使用我們的哪種套餐。您可以在我們的聯絡頁面上找到我們的地址。我們在虛擬明信片牆上發布所有收到的明信片。
該軟體包需要支援json
列的資料庫,例如 MySQL 5.7 或更高版本。
對於 Laravel 版本 6 和 7 或 PHP 7,請使用此套件的版本 1.x。
您可以透過 Composer 安裝該軟體包:
composer require spatie/laravel-schemaless-attributes
無模式屬性將儲存在模型表上的 json 列中。讓我們新增該列並準備模型。
為要新增無架構屬性的所有模型新增遷移。您應該在Blueprint
上使用schemalessAttributes
方法來新增列。您提供給schemalessAttributes
的參數是將要新增的欄位名稱。您可以使用任何您喜歡的名稱。您也可以根據需要向表中新增任意數量的無架構屬性列。在本自述文件的所有範例中,我們將使用名為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
請參閱變更日誌以了解有關最近更改內容的更多資訊。
詳細資訊請參閱貢獻。
請查看我們的安全政策,以了解如何通報安全漏洞。
麻省理工學院許可證 (MIT)。請參閱許可證文件以獲取更多資訊。