Não seria legal se você pudesse ter um pouco do espírito do NoSQL disponível no Eloquent? Este pacote faz exatamente isso. Ele fornece uma característica que, quando aplicada em um modelo, permite armazenar valores arbitrários em uma única coluna JSON.
Aqui estão alguns exemplos. Estamos usando a coluna extra_attributes
aqui, mas você pode nomeá-la como quiser.
// 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 ' );
Investimos muitos recursos na criação dos melhores pacotes de código aberto. Você pode nos apoiar comprando um de nossos produtos pagos.
Agradecemos muito que você nos envie um cartão postal de sua cidade natal, mencionando qual(is) de nossos pacotes você está usando. Você encontrará nosso endereço em nossa página de contato. Publicamos todos os cartões postais recebidos em nosso mural virtual de cartões postais.
Este pacote requer um banco de dados com suporte para colunas json
como MySQL 5.7 ou superior.
Para as versões 6 e 7 do Laravel ou PHP 7, use a versão 1.x deste pacote.
Você pode instalar o pacote via compositor:
composer require spatie/laravel-schemaless-attributes
Os atributos sem esquema serão armazenados em uma coluna json na tabela do seu modelo. Vamos adicionar essa coluna e preparar o modelo.
Adicione uma migração para todos os modelos aos quais você deseja adicionar atributos sem esquema. Você deve usar o método schemalessAttributes
no Blueprint
para adicionar uma coluna. O argumento que você fornece para schemalessAttributes
é o nome da coluna que será adicionada. Você pode usar qualquer nome que desejar. Você também pode adicionar quantas colunas de atributos sem esquema desejar à sua tabela. Em todos os exemplos deste leia-me, usaremos uma única coluna chamada extra_attributes
.
Schema:: table ( ' your_models ' , function ( Blueprint $ table ) {
$ table -> schemalessAttributes ( ' extra_attributes ' );
});
Para trabalhar com os atributos sem esquema, você precisará adicionar uma conversão personalizada e um escopo ao seu modelo. Aqui está um exemplo do que você precisa adicionar se tiver escolhido extra_attributes
como nome da coluna.
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 ();
}
// ...
}
Se precisar de suporte para várias colunas sem esquema em um único modelo, você deve usar a característica SchemalessAttributesTrait
. Aqui está um exemplo do que você precisa adicionar se tiver escolhido extra_attributes, other_extra_attributes
como nomes de colunas.
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 ();
}
// ...
}
Se você quiser reutilizar esse comportamento em vários modelos, poderá optar por colocar a função em uma característica própria. Esta é a aparência dessa característica:
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 é a maneira mais fácil de obter e definir atributos sem esquema:
$ yourModel -> extra_attributes -> name = ' value ' ;
$ yourModel -> extra_attributes -> name ; // Returns 'value'
Alternativamente, você pode usar uma abordagem de array:
$ yourModel -> extra_attributes [ ' name ' ] = ' value ' ;
$ yourModel -> extra_attributes [ ' name ' ]; // Returns 'value'
Você pode substituir todos os atributos sem esquema existentes atribuindo uma matriz a eles.
// All existing schemaless attributes will be replaced
$ yourModel -> extra_attributes = [ ' name ' => ' value ' ];
$ yourModel -> extra_attributes -> all (); // Returns ['name' => 'value']
Você também pode optar por usar get
e set
. Os métodos têm suporte para notação de ponto.
$ yourModel -> extra_attributes = [
' rey ' => [ ' side ' => ' light ' ],
' snoke ' => [ ' side ' => ' dark ' ],
];
$ yourModel -> extra_attributes -> set ( ' rey.side ' , ' dark ' );
$ yourModel -> extra_attributes -> get ( ' rey.side ' ); // Returns 'dark
Você também pode passar um valor padrão para o método get
.
$ yourModel -> extra_attributes -> get ( ' non_existing ' , ' default ' ); // Returns 'default'
Para persistir atributos sem esquema você deve, assim como faz para atributos normais, chamar save()
no modelo.
$ yourModel -> save (); // Persists both normal and schemaless attributes
Veja como você pode usar o modelScope fornecido.
// Returns all models that have all the given schemaless attributes
$ yourModel -> withExtraAttributes ([ ' name ' => ' value ' , ' name2 ' => ' value2 ' ])-> get ();
Se você deseja pesquisar apenas um único atributo personalizado, você pode usar o modelScope assim
// returns all models that have a schemaless attribute `name` set to `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' value ' )-> get ();
Além disso, se você deseja pesquisar apenas um único atributo personalizado com um operador personalizado, você pode usar o modelScope assim
// returns all models that have a schemaless attribute `name` starting with `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' LIKE ' , ' value% ' )-> get ();
Se você deseja pesquisar apenas em um atributo personalizado aninhado, você pode usar o modelScope assim
// returns all models that have a schemaless nested attribute `han.side` set to `light`
$ yourModel -> withExtraAttributes ( ' han->side ' , ' light ' )-> get ();
Primeiro crie um banco de dados MySQL chamado laravel_schemaless_attributes
. Depois disso você pode executar os testes com:
composer test
Consulte CHANGELOG para obter mais informações sobre o que mudou recentemente.
Consulte CONTRIBUINDO para obter detalhes.
Revise nossa política de segurança sobre como relatar vulnerabilidades de segurança.
A licença MIT (MIT). Consulte Arquivo de licença para obter mais informações.