Bukankah lebih keren jika Anda bisa memiliki sedikit semangat NoSQL yang tersedia di Eloquent? Paket ini melakukan hal itu. Ini memberikan sifat yang ketika diterapkan pada model, memungkinkan Anda menyimpan nilai arbitrer dalam satu kolom JSON.
Berikut beberapa contohnya. Kami menggunakan kolom extra_attributes
di sini, tetapi Anda dapat memberi nama apa pun yang Anda inginkan.
// 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 ' );
Kami menginvestasikan banyak sumber daya untuk menciptakan paket sumber terbuka terbaik di kelasnya. Anda dapat mendukung kami dengan membeli salah satu produk berbayar kami.
Kami sangat menghargai Anda mengirimi kami kartu pos dari kota asal Anda, yang menyebutkan paket kami mana yang Anda gunakan. Anda akan menemukan alamat kami di halaman kontak kami. Kami mempublikasikan semua kartu pos yang diterima di dinding kartu pos virtual kami.
Paket ini memerlukan database dengan dukungan kolom json
seperti MySQL 5.7 atau lebih tinggi.
Untuk Laravel versi 6 & 7 atau PHP 7, gunakan versi 1.x dari paket ini.
Anda dapat menginstal paket melalui composer:
composer require spatie/laravel-schemaless-attributes
Atribut tanpa skema akan disimpan dalam kolom json pada tabel model Anda. Mari tambahkan kolom itu dan siapkan modelnya.
Tambahkan migrasi untuk semua model yang ingin Anda tambahkan atribut tanpa skema. Anda harus menggunakan schemalessAttributes
pada Blueprint
untuk menambahkan kolom. Argumen yang Anda berikan schemalessAttributes
adalah nama kolom yang akan ditambahkan. Anda dapat menggunakan nama apa pun yang Anda suka. Anda juga bebas menambahkan kolom atribut tanpa skema ke tabel sebanyak yang Anda inginkan. Dalam semua contoh readme ini kita akan menggunakan satu kolom bernama extra_attributes
.
Schema:: table ( ' your_models ' , function ( Blueprint $ table ) {
$ table -> schemalessAttributes ( ' extra_attributes ' );
});
Agar dapat bekerja dengan atribut tanpa skema, Anda harus menambahkan pemeran khusus dan cakupan pada model Anda. Berikut ini contoh apa yang perlu Anda tambahkan jika Anda memilih extra_attributes
sebagai nama kolom Anda.
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 ();
}
// ...
}
Jika Anda memerlukan dukungan untuk beberapa kolom tanpa skema pada satu model, Anda harus menggunakan sifat SchemalessAttributesTrait
. Berikut ini contoh apa yang perlu Anda tambahkan jika Anda memilih extra_attributes, other_extra_attributes
sebagai nama kolom Anda.
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 ();
}
// ...
}
Jika Anda ingin menggunakan kembali perilaku ini di beberapa model, Anda dapat memilih untuk menempatkan fungsi tersebut dalam ciri Anda sendiri. Berikut adalah gambaran sifat tersebut:
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 ();
}
}
Ini adalah cara termudah untuk mendapatkan dan menyetel atribut tanpa skema:
$ yourModel -> extra_attributes -> name = ' value ' ;
$ yourModel -> extra_attributes -> name ; // Returns 'value'
Alternatifnya, Anda dapat menggunakan pendekatan array:
$ yourModel -> extra_attributes [ ' name ' ] = ' value ' ;
$ yourModel -> extra_attributes [ ' name ' ]; // Returns 'value'
Anda dapat mengganti semua atribut tanpa skema yang ada dengan menetapkan array ke dalamnya.
// All existing schemaless attributes will be replaced
$ yourModel -> extra_attributes = [ ' name ' => ' value ' ];
$ yourModel -> extra_attributes -> all (); // Returns ['name' => 'value']
Anda juga dapat memilih untuk menggunakan get
dan set
. Metode ini mendukung notasi titik.
$ yourModel -> extra_attributes = [
' rey ' => [ ' side ' => ' light ' ],
' snoke ' => [ ' side ' => ' dark ' ],
];
$ yourModel -> extra_attributes -> set ( ' rey.side ' , ' dark ' );
$ yourModel -> extra_attributes -> get ( ' rey.side ' ); // Returns 'dark
Anda juga dapat meneruskan nilai default ke metode get
.
$ yourModel -> extra_attributes -> get ( ' non_existing ' , ' default ' ); // Returns 'default'
Untuk mempertahankan atribut tanpa skema, seperti yang Anda lakukan pada atribut normal, panggil save()
pada model.
$ yourModel -> save (); // Persists both normal and schemaless attributes
Berikut cara menggunakan modelScope yang disediakan.
// Returns all models that have all the given schemaless attributes
$ yourModel -> withExtraAttributes ([ ' name ' => ' value ' , ' name2 ' => ' value2 ' ])-> get ();
Jika Anda hanya ingin mencari pada satu atribut khusus, Anda dapat menggunakan modelScope seperti ini
// returns all models that have a schemaless attribute `name` set to `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' value ' )-> get ();
Selain itu, jika Anda hanya ingin mencari pada satu atribut khusus dengan operator khusus, Anda dapat menggunakan modelScope seperti ini
// returns all models that have a schemaless attribute `name` starting with `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' LIKE ' , ' value% ' )-> get ();
Jika Anda hanya ingin mencari pada atribut khusus yang disarangkan, Anda dapat menggunakan modelScope seperti ini
// returns all models that have a schemaless nested attribute `han.side` set to `light`
$ yourModel -> withExtraAttributes ( ' han->side ' , ' light ' )-> get ();
Pertama buat database MySQL bernama laravel_schemaless_attributes
. Setelah itu Anda dapat menjalankan tes dengan:
composer test
Silakan lihat CHANGELOG untuk informasi lebih lanjut tentang apa yang berubah baru-baru ini.
Silakan lihat KONTRIBUSI untuk rinciannya.
Harap tinjau kebijakan keamanan kami tentang cara melaporkan kerentanan keamanan.
Lisensi MIT (MIT). Silakan lihat File Lisensi untuk informasi lebih lanjut.