Было бы здорово, если бы дух NoSQL был доступен в Eloquent? Этот пакет делает именно это. Он предоставляет особенность, которая при применении к модели позволяет хранить произвольные значения в одном столбце JSON.
Вот несколько примеров. Здесь мы используем столбец extra_attributes
, но вы можете назвать его как хотите.
// 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 ' );
Мы вкладываем много ресурсов в создание лучших в своем классе пакетов с открытым исходным кодом. Вы можете поддержать нас, купив один из наших платных продуктов.
Мы очень признательны вам за отправку нам открытки из вашего родного города с указанием того, какой из наших пакетов вы используете. Наш адрес вы найдете на странице контактов. Все полученные открытки мы публикуем на нашей виртуальной стене открыток.
Для этого пакета требуется база данных с поддержкой столбцов json
, например MySQL 5.7 или выше.
Для версий Laravel 6 и 7 или PHP 7 используйте версию 1.x этого пакета.
Вы можете установить пакет через композитор:
composer require spatie/laravel-schemaless-attributes
Атрибуты без схемы будут храниться в столбце json в таблице вашей модели. Давайте добавим этот столбец и подготовим модель.
Добавьте миграцию для всех моделей, в которые вы хотите добавить бессхемные атрибуты. Чтобы добавить столбец, вам следует использовать метод schemalessAttributes
в Blueprint
. Аргумент, который вы передаете schemalessAttributes
— это имя столбца, который будет добавлен. Вы можете использовать любое имя, какое захотите. Вы также можете добавить в таблицу столько столбцов бессхемных атрибутов, сколько захотите. Во всех примерах этого файла сведений мы будем использовать один столбец с именем extra_attributes
.
Schema:: table ( ' your_models ' , function ( Blueprint $ table ) {
$ table -> schemalessAttributes ( ' extra_attributes ' );
});
Чтобы работать с атрибутами без схемы, вам необходимо добавить в свою модель собственное приведение и область видимости. Вот пример того, что вам нужно добавить, если вы выбрали extra_attributes
в качестве имени столбца.
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 ();
}
// ...
}
Если вам нужна поддержка нескольких бессхемных столбцов в одной модели, вам следует использовать признак SchemalessAttributesTrait
. Вот пример того, что вам нужно добавить, если вы выбрали extra_attributes, other_extra_attributes
в качестве имен столбцов.
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 ();
}
// ...
}
Если вы хотите повторно использовать это поведение в нескольких моделях, вы можете поместить эту функцию в свой собственный признак. Вот как может выглядеть эта черта:
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 ();
}
}
Это самый простой способ получить и установить бессхемные атрибуты:
$ yourModel -> extra_attributes -> name = ' value ' ;
$ yourModel -> extra_attributes -> name ; // Returns 'value'
В качестве альтернативы вы можете использовать подход массива:
$ yourModel -> extra_attributes [ ' name ' ] = ' value ' ;
$ yourModel -> extra_attributes [ ' name ' ]; // Returns 'value'
Вы можете заменить все существующие бессхемные атрибуты, присвоив им массив.
// All existing schemaless attributes will be replaced
$ yourModel -> extra_attributes = [ ' name ' => ' value ' ];
$ yourModel -> extra_attributes -> all (); // Returns ['name' => 'value']
Вы также можете использовать get
и set
. Методы поддерживают точечную запись.
$ yourModel -> extra_attributes = [
' rey ' => [ ' side ' => ' light ' ],
' snoke ' => [ ' side ' => ' dark ' ],
];
$ yourModel -> extra_attributes -> set ( ' rey.side ' , ' dark ' );
$ yourModel -> extra_attributes -> get ( ' rey.side ' ); // Returns 'dark
Вы также можете передать значение по умолчанию методу get
.
$ yourModel -> extra_attributes -> get ( ' non_existing ' , ' default ' ); // Returns 'default'
Чтобы сохранить атрибуты без схемы, вам следует, как и для обычных атрибутов, вызвать save()
в модели.
$ yourModel -> save (); // Persists both normal and schemaless attributes
Вот как вы можете использовать предоставленный modelScope.
// Returns all models that have all the given schemaless attributes
$ yourModel -> withExtraAttributes ([ ' name ' => ' value ' , ' name2 ' => ' value2 ' ])-> get ();
Если вы хотите выполнить поиск только по одному настраиваемому атрибуту, вы можете использовать modelScope следующим образом:
// returns all models that have a schemaless attribute `name` set to `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' value ' )-> get ();
Кроме того, если вы хотите выполнять поиск только по одному настраиваемому атрибуту с помощью настраиваемого оператора, вы можете использовать modelScope следующим образом:
// returns all models that have a schemaless attribute `name` starting with `value`
$ yourModel -> withExtraAttributes ( ' name ' , ' LIKE ' , ' value% ' )-> get ();
Если вы хотите выполнять поиск только по вложенному пользовательскому атрибуту, вы можете использовать modelScope следующим образом.
// returns all models that have a schemaless nested attribute `han.side` set to `light`
$ yourModel -> withExtraAttributes ( ' han->side ' , ' light ' )-> get ();
Сначала создайте базу данных MySQL с именем laravel_schemaless_attributes
. После этого вы можете запустить тесты с помощью:
composer test
Пожалуйста, посетите CHANGELOG для получения дополнительной информации о том, что изменилось за последнее время.
Пожалуйста, смотрите ВКЛАД для получения подробной информации.
Пожалуйста, ознакомьтесь с нашей политикой безопасности, чтобы узнать, как сообщать об уязвимостях безопасности.
Лицензия MIT (MIT). Дополнительную информацию см. в файле лицензии.