Ne serait-ce pas cool si vous pouviez avoir un peu de l'esprit NoSQL disponible dans Eloquent ? C'est exactement ce que fait ce package. Il fournit un trait qui, lorsqu'il est appliqué à un modèle, vous permet de stocker des valeurs arbitraires dans une seule colonne JSON.
Voici quelques exemples. Nous utilisons ici la colonne extra_attributes
, mais vous pouvez la nommer comme vous le souhaitez.
// 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 ' );
Nous investissons beaucoup de ressources dans la création des meilleurs packages open source de leur catégorie. Vous pouvez nous soutenir en achetant l'un de nos produits payants.
Nous apprécions grandement que vous nous envoyiez une carte postale de votre ville natale, mentionnant le(s) forfait(s) que vous utilisez. Vous trouverez notre adresse sur notre page contact. Nous publions toutes les cartes postales reçues sur notre mur virtuel de cartes postales.
Ce package nécessite une base de données prenant en charge les colonnes json
comme MySQL 5.7 ou supérieur.
Pour les versions 6 et 7 de Laravel ou PHP 7, utilisez la version 1.x de ce package.
Vous pouvez installer le package via composer :
composer require spatie/laravel-schemaless-attributes
Les attributs sans schéma seront stockés dans une colonne json sur la table de votre modèle. Ajoutons cette colonne et préparons le modèle.
Ajoutez une migration pour tous les modèles auxquels vous souhaitez ajouter des attributs sans schéma. Vous devez utiliser la méthode schemalessAttributes
sur Blueprint
pour ajouter une colonne. L'argument que vous donnez à schemalessAttributes
est le nom de la colonne qui sera ajoutée. Vous pouvez utiliser n'importe quel nom que vous souhaitez. Vous êtes également libre d'ajouter autant de colonnes d'attributs sans schéma à votre table que vous le souhaitez. Dans tous les exemples de ce fichier Lisez-moi, nous utiliserons une seule colonne nommée extra_attributes
.
Schema:: table ( ' your_models ' , function ( Blueprint $ table ) {
$ table -> schemalessAttributes ( ' extra_attributes ' );
});
Afin de travailler avec les attributs sans schéma, vous devrez ajouter une distribution personnalisée et une portée sur votre modèle. Voici un exemple de ce que vous devez ajouter si vous avez choisi extra_attributes
comme nom de colonne.
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 ();
}
// ...
}
Si vous avez besoin de prendre en charge plusieurs colonnes sans schéma sur un seul modèle, vous devez utiliser le trait SchemalessAttributesTrait
. Voici un exemple de ce que vous devez ajouter si vous avez choisi extra_attributes, other_extra_attributes
comme noms de colonnes.
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 ();
}
// ...
}
Si vous souhaitez réutiliser ce comportement sur plusieurs modèles, vous pouvez choisir de placer la fonction dans votre propre trait. Voici à quoi pourrait ressembler ce trait :
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 ();
}
}
Il s'agit du moyen le plus simple d'obtenir et de définir des attributs sans schéma :
$ yourModel -> extra_attributes -> name = ' value ' ;
$ yourModel -> extra_attributes -> name ; // Returns 'value'
Vous pouvez également utiliser une approche matricielle :
$ yourModel -> extra_attributes [ ' name ' ] = ' value ' ;
$ yourModel -> extra_attributes [ ' name ' ]; // Returns 'value'
Vous pouvez remplacer tous les attributs sans schéma existants en leur attribuant un tableau.
// All existing schemaless attributes will be replaced
$ yourModel -> extra_attributes = [ ' name ' => ' value ' ];
$ yourModel -> extra_attributes -> all (); // Returns ['name' => 'value']
Vous pouvez également choisir d'utiliser get
et set
. Les méthodes prennent en charge la notation par points.
$ yourModel -> extra_attributes = [
' rey ' => [ ' side ' => ' light ' ],
' snoke ' => [ ' side ' => ' dark ' ],
];
$ yourModel -> extra_attributes -> set ( ' rey.side ' , ' dark ' );
$ yourModel -> extra_attributes -> get ( ' rey.side ' ); // Returns 'dark
Vous pouvez également transmettre une valeur par défaut à la méthode get
.
$ yourModel -> extra_attributes -> get ( ' non_existing ' , ' default ' ); // Returns 'default'
Pour conserver les attributs sans schéma, vous devez, comme vous le faites pour les attributs normaux, appeler save()
sur le modèle.
$ yourModel -> save (); // Persists both normal and schemaless attributes
Voici comment utiliser le modelScope fourni.
// Returns all models that have all the given schemaless attributes
$ yourModel -> withExtraAttributes ([ ' name ' => ' value ' , ' name2 ' => ' value2 ' ])-> get ();
Si vous souhaitez rechercher uniquement sur un seul attribut personnalisé, vous pouvez utiliser modelScope comme ceci
// returns all models that have a schemaless attribute `name` set to `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' value ' )-> get ();
De plus, si vous souhaitez uniquement rechercher un seul attribut personnalisé avec un opérateur personnalisé, vous pouvez utiliser modelScope comme ceci
// returns all models that have a schemaless attribute `name` starting with `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' LIKE ' , ' value% ' )-> get ();
Si vous souhaitez uniquement rechercher un attribut personnalisé imbriqué, vous pouvez utiliser modelScope comme ceci
// returns all models that have a schemaless nested attribute `han.side` set to `light`
$ yourModel -> withExtraAttributes ( ' han->side ' , ' light ' )-> get ();
Créez d’abord une base de données MySQL nommée laravel_schemaless_attributes
. Après cela, vous pouvez exécuter les tests avec :
composer test
Veuillez consulter CHANGELOG pour plus d'informations sur ce qui a changé récemment.
Veuillez consulter CONTRIBUER pour plus de détails.
Veuillez consulter notre politique de sécurité pour savoir comment signaler les vulnérabilités de sécurité.
La licence MIT (MIT). Veuillez consulter le fichier de licence pour plus d'informations.