¿No sería genial si pudieras tener un poco del espíritu de NoSQL disponible en Eloquent? Este paquete hace precisamente eso. Proporciona un rasgo que, cuando se aplica a un modelo, le permite almacenar valores arbitrarios en una sola columna JSON.
A continuación se muestran algunos ejemplos. Estamos usando la columna extra_attributes
aquí, pero puedes nombrarla como quieras.
// 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 ' );
Invertimos muchos recursos en la creación de los mejores paquetes de código abierto. Puedes apoyarnos comprando uno de nuestros productos pagos.
Apreciamos mucho que nos envíe una postal desde su ciudad natal, mencionando cuál de nuestros paquetes está utilizando. Encontrarás nuestra dirección en nuestra página de contacto. Publicamos todas las postales recibidas en nuestro muro virtual de postales.
Este paquete requiere una base de datos compatible con columnas json
como MySQL 5.7 o superior.
Para las versiones 6 y 7 de Laravel o PHP 7, utilice la versión 1.x de este paquete.
Puede instalar el paquete a través del compositor:
composer require spatie/laravel-schemaless-attributes
Los atributos sin esquema se almacenarán en una columna json en la tabla de su modelo. Agreguemos esa columna y preparemos el modelo.
Agregue una migración para todos los modelos a los que desee agregar atributos sin esquema. Debe utilizar el método schemalessAttributes
en Blueprint
para agregar una columna. El argumento que le da a schemalessAttributes
es el nombre de la columna que se agregará. Puedes usar cualquier nombre que quieras. También puede agregar tantas columnas de atributos sin esquema a su tabla como desee. En todos los ejemplos de este archivo Léame usaremos una sola columna denominada extra_attributes
.
Schema:: table ( ' your_models ' , function ( Blueprint $ table ) {
$ table -> schemalessAttributes ( ' extra_attributes ' );
});
Para trabajar con los atributos sin esquema, deberá agregar una conversión personalizada y un alcance en su modelo. A continuación se muestra un ejemplo de lo que debe agregar si ha elegido extra_attributes
como nombre de columna.
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 necesita compatibilidad con varias columnas sin esquema en un solo modelo, debe usar el rasgo SchemalessAttributesTrait
. A continuación se muestra un ejemplo de lo que debe agregar si ha elegido extra_attributes, other_extra_attributes
como nombres de columna.
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 desea reutilizar este comportamiento en varios modelos, puede optar por poner la función en su propio rasgo. Así es como podría verse ese rasgo:
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 ();
}
}
Esta es la forma más sencilla de obtener y configurar atributos sin esquema:
$ yourModel -> extra_attributes -> name = ' value ' ;
$ yourModel -> extra_attributes -> name ; // Returns 'value'
Alternativamente, puede utilizar un enfoque de matriz:
$ yourModel -> extra_attributes [ ' name ' ] = ' value ' ;
$ yourModel -> extra_attributes [ ' name ' ]; // Returns 'value'
Puede reemplazar todos los atributos sin esquema existentes asignándole una matriz.
// All existing schemaless attributes will be replaced
$ yourModel -> extra_attributes = [ ' name ' => ' value ' ];
$ yourModel -> extra_attributes -> all (); // Returns ['name' => 'value']
También puede optar por utilizar get
y set
. Los métodos admiten la notación de puntos.
$ yourModel -> extra_attributes = [
' rey ' => [ ' side ' => ' light ' ],
' snoke ' => [ ' side ' => ' dark ' ],
];
$ yourModel -> extra_attributes -> set ( ' rey.side ' , ' dark ' );
$ yourModel -> extra_attributes -> get ( ' rey.side ' ); // Returns 'dark
También puedes pasar un valor predeterminado al método get
.
$ yourModel -> extra_attributes -> get ( ' non_existing ' , ' default ' ); // Returns 'default'
Para conservar los atributos sin esquema, al igual que lo hace con los atributos normales, debe llamar save()
en el modelo.
$ yourModel -> save (); // Persists both normal and schemaless attributes
A continuación se explica cómo puede utilizar el modelScope proporcionado.
// Returns all models that have all the given schemaless attributes
$ yourModel -> withExtraAttributes ([ ' name ' => ' value ' , ' name2 ' => ' value2 ' ])-> get ();
Si solo desea buscar en un único atributo personalizado, puede usar modelScope de esta manera
// returns all models that have a schemaless attribute `name` set to `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' value ' )-> get ();
Además, si solo desea buscar en un único atributo personalizado con un operador personalizado, puede usar modelScope de esta manera
// returns all models that have a schemaless attribute `name` starting with `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' LIKE ' , ' value% ' )-> get ();
Si solo desea buscar en un atributo personalizado anidado, puede usar modelScope de esta manera
// returns all models that have a schemaless nested attribute `han.side` set to `light`
$ yourModel -> withExtraAttributes ( ' han->side ' , ' light ' )-> get ();
Primero cree una base de datos MySQL llamada laravel_schemaless_attributes
. Después de eso puedes ejecutar las pruebas con:
composer test
Consulte CHANGELOG para obtener más información sobre los cambios recientes.
Consulte CONTRIBUCIÓN para obtener más detalles.
Revise nuestra política de seguridad sobre cómo informar vulnerabilidades de seguridad.
La Licencia MIT (MIT). Consulte el archivo de licencia para obtener más información.