Wäre es nicht cool, wenn Sie ein wenig vom Geist von NoSQL in Eloquent hätten? Dieses Paket macht genau das. Es bietet eine Eigenschaft, die es Ihnen bei Anwendung auf ein Modell ermöglicht, beliebige Werte in einer einzelnen JSON-Spalte zu speichern.
Hier ein paar Beispiele. Wir verwenden hier die Spalte extra_attributes
, aber Sie können ihr einen beliebigen Namen geben.
// 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 ' );
Wir investieren viele Ressourcen in die Erstellung erstklassiger Open-Source-Pakete. Sie können uns unterstützen, indem Sie eines unserer kostenpflichtigen Produkte kaufen.
Wir freuen uns sehr, dass Sie uns eine Postkarte aus Ihrer Heimatstadt schicken und erwähnen, welches unserer Pakete Sie verwenden. Unsere Adresse finden Sie auf unserer Kontaktseite. Wir veröffentlichen alle erhaltenen Postkarten auf unserer virtuellen Postkartenwand.
Dieses Paket erfordert eine Datenbank mit Unterstützung für json
-Spalten wie MySQL 5.7 oder höher.
Verwenden Sie für die Laravel-Versionen 6 und 7 oder PHP 7 Version 1.x dieses Pakets.
Sie können das Paket über Composer installieren:
composer require spatie/laravel-schemaless-attributes
Die schemalosen Attribute werden in einer JSON-Spalte in der Tabelle Ihres Modells gespeichert. Fügen wir diese Spalte hinzu und bereiten das Modell vor.
Fügen Sie eine Migration für alle Modelle hinzu, denen Sie schemalose Attribute hinzufügen möchten. Sie sollten die Methode schemalessAttributes
für Blueprint
verwenden, um eine Spalte hinzuzufügen. Das Argument, das Sie schemalessAttributes
angeben, ist der Spaltenname, der hinzugefügt wird. Sie können einen beliebigen Namen verwenden. Sie können Ihrer Tabelle auch so viele schemalose Attributspalten hinzufügen, wie Sie möchten. In allen Beispielen dieser Readme-Datei verwenden wir eine einzelne Spalte mit dem Namen extra_attributes
.
Schema:: table ( ' your_models ' , function ( Blueprint $ table ) {
$ table -> schemalessAttributes ( ' extra_attributes ' );
});
Um mit den schemalosen Attributen arbeiten zu können, müssen Sie Ihrem Modell eine benutzerdefinierte Umwandlung und einen Bereich hinzufügen. Hier ist ein Beispiel dafür, was Sie hinzufügen müssen, wenn Sie extra_attributes
als Spaltennamen ausgewählt haben.
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 ();
}
// ...
}
Wenn Sie Unterstützung für mehrere schemalose Spalten in einem einzelnen Modell benötigen, sollten Sie das Merkmal SchemalessAttributesTrait
verwenden. Hier ist ein Beispiel dafür, was Sie hinzufügen müssen, wenn Sie extra_attributes, other_extra_attributes
als Spaltennamen ausgewählt haben.
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 ();
}
// ...
}
Wenn Sie dieses Verhalten in mehreren Modellen wiederverwenden möchten, können Sie die Funktion in ein eigenes Merkmal einfügen. So könnte dieses Merkmal aussehen:
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 ();
}
}
Dies ist der einfachste Weg, schemalose Attribute abzurufen und festzulegen:
$ yourModel -> extra_attributes -> name = ' value ' ;
$ yourModel -> extra_attributes -> name ; // Returns 'value'
Alternativ können Sie einen Array-Ansatz verwenden:
$ yourModel -> extra_attributes [ ' name ' ] = ' value ' ;
$ yourModel -> extra_attributes [ ' name ' ]; // Returns 'value'
Sie können alle vorhandenen schemalosen Attribute ersetzen, indem Sie ihnen ein Array zuweisen.
// All existing schemaless attributes will be replaced
$ yourModel -> extra_attributes = [ ' name ' => ' value ' ];
$ yourModel -> extra_attributes -> all (); // Returns ['name' => 'value']
Sie können sich auch für die Verwendung get
und set
entscheiden. Die Methoden unterstützen die Punktnotation.
$ yourModel -> extra_attributes = [
' rey ' => [ ' side ' => ' light ' ],
' snoke ' => [ ' side ' => ' dark ' ],
];
$ yourModel -> extra_attributes -> set ( ' rey.side ' , ' dark ' );
$ yourModel -> extra_attributes -> get ( ' rey.side ' ); // Returns 'dark
Sie können der get
-Methode auch einen Standardwert übergeben.
$ yourModel -> extra_attributes -> get ( ' non_existing ' , ' default ' ); // Returns 'default'
Um schemalose Attribute beizubehalten, sollten Sie, genau wie bei normalen Attributen, save()
für das Modell aufrufen.
$ yourModel -> save (); // Persists both normal and schemaless attributes
So können Sie das bereitgestellte modelScope verwenden.
// Returns all models that have all the given schemaless attributes
$ yourModel -> withExtraAttributes ([ ' name ' => ' value ' , ' name2 ' => ' value2 ' ])-> get ();
Wenn Sie nur nach einem einzelnen benutzerdefinierten Attribut suchen möchten, können Sie modelScope wie folgt verwenden
// returns all models that have a schemaless attribute `name` set to `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' value ' )-> get ();
Wenn Sie außerdem nur nach einem einzelnen benutzerdefinierten Attribut mit einem benutzerdefinierten Operator suchen möchten, können Sie modelScope wie folgt verwenden
// returns all models that have a schemaless attribute `name` starting with `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' LIKE ' , ' value% ' )-> get ();
Wenn Sie nur nach einem verschachtelten benutzerdefinierten Attribut suchen möchten, können Sie modelScope wie folgt verwenden
// returns all models that have a schemaless nested attribute `han.side` set to `light`
$ yourModel -> withExtraAttributes ( ' han->side ' , ' light ' )-> get ();
Erstellen Sie zunächst eine MySQL-Datenbank mit dem Namen laravel_schemaless_attributes
. Danach können Sie die Tests ausführen mit:
composer test
Weitere Informationen zu den letzten Änderungen finden Sie im CHANGELOG.
Weitere Informationen finden Sie unter BEITRAGEN.
Bitte lesen Sie unsere Sicherheitsrichtlinie zum Melden von Sicherheitslücken.
Die MIT-Lizenz (MIT). Weitere Informationen finden Sie in der Lizenzdatei.