如果您能在 Eloquent 中获得一点 NoSQL 的精神,那不是很酷吗?这个包就是这么做的。它提供了一个特征,当应用于模型时,允许您在单个 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 安装该软件包:
composer require spatie/laravel-schemaless-attributes
无模式属性将存储在模型表上的 json 列中。让我们添加该列并准备模型。
为要添加无架构属性的所有模型添加迁移。您应该在Blueprint
上使用schemalessAttributes
方法来添加列。您提供给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 ();
首先创建一个名为laravel_schemaless_attributes
的 MySQL 数据库。之后,您可以使用以下命令运行测试:
composer test
请参阅变更日志以了解有关最近更改内容的更多信息。
详细信息请参阅贡献。
请查看我们的安全政策,了解如何报告安全漏洞。
麻省理工学院许可证 (MIT)。请参阅许可证文件以获取更多信息。