darkeum/darklyy-json-attributes

为 Darklyy 模型添加 JSON 属性。

v1.0.2 2022-08-29 12:28 UTC

This package is auto-updated.

Last update: 2024-09-29 06:14:48 UTC


README

Latest Version on Packagist Total Downloads

如果 Darklyy 有使用 NoSQL 精神的可能性,那将是件好事。这个包正是这样做的。它提供了一个特质,当应用到模型上时,可以在一个 JSON 列中存储任意值。

以下是一些示例。这里我们使用 extra_attributes 列,但你也可以将其命名为任何你想要的名称

// получение значений
$yourModel->extra_attributes->name = 'value';
$yourModel->extra_attributes->name; // returns 'value'

// вы также можете использовать массив
$yourModel->extra_attributes['name'] = 'value';
$yourModel->extra_attributes['name'] // returns 'value'

// установка нескольких значений за раз
$yourModel->extra_attributes = [
   'rey' => ['side' => 'light'],
   'snoke' => ['side' => 'dark']
];

// добавление/обновление нескольких значений за один раз через set()установка/обновление нескольких значений за один раз через set()
$yourModel->extra_attributes->set([
   'han' => ['side' => 'light'],
   'snoke' => ['side' => 'dark']
]);

// получение значений с использованием записи через точкуполучение значений с использованием записи через точку
$yourModel->extra_attributes->get('rey.side'); // returns 'light'

// получить значение по умолчанию, когда атрибут не существует
$yourModel->extra_attributes->get('non_existing', 'default'); // returns 'default'

// если у модели есть modelScope то вы можете получить все занчения с заданными JSON атрибутами.
$yourModel->withSchemalessAttributes(['name' => 'value', 'name2' => 'value2'])->get();

// удалить ключ и значение
$yourModel->extra_attributes->forget('key');

要求

此包需要支持 json 列的数据库,例如 MySQL 5.7 或更高版本。

安装

您可以通过 composer 安装此包

composer require darkeum/darklyy-json-attributes

JSON 属性将存储在您的模型表的 json 列中。让我们添加这个列并准备模型。

添加存储 JSON 属性的列

为要添加 JSON 属性的所有模型添加迁移。您应该在 Blueprint 中使用 jsonAttributes 方法来添加列。您给 jsonAttributes 的参数是您要添加的列的名称。您可以使用任何名称。您还可以在表中添加任意数量的无模式列属性。在本文件的所有示例中,我们将使用名为 extra_attributes 的单个列。

Schema::table('your_models', function (Blueprint $table) {
    $table->jsonAttributes('extra_attributes');
});

准备模型

为了使用 JSON 属性,您需要为您的模型添加自定义的缩写和作用域。以下是在选择了 extra_attributes 作为列名称时需要添加的内容的示例。

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use Darkeum\JsonAttributes\Casts\JsonAttributes;

class TestModel extends Model
{
    // ...

    public $casts = [
        'extra_attributes' => JsonAttributes::class,
    ];

    public function scopeWithExtraAttributes(): Builder
    {
        return $this->extra_attributes->modelScope();
    }

    // ...
}

如果您需要在单个模型中使用多个无模式列,您应该使用 JsonAttributesTrait 特质。以下是在选择了 extra_attributes, other_extra_attributes 作为列名称时需要添加的内容的示例。

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use Darkeum\JsonAttributes\JsonAttributes;
use Darkeum\JsonAttributes\JsonAttributesTrait;

class TestModel extends Model
{
    use JsonAttributesTrait;

    // ...
  
    /**
     * @var array
     */
    protected $jsonAttributes = [
        '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 Darkeum\JsonAttributes\Casts\JsonAttributes;

trait HasJsonAttributes
{
    public function initializeHasJsonAttributes()
    {
        $this->casts['extra_attributes'] = JsonAttributes::class;
    }
  
    public function scopeWithExtraAttributes(): Builder
    {
        return $this->extra_attributes->modelScope();
    }
}

使用

获取和设置 JSON 属性

这是获取和设置 JSON 属性的最简单方法

$yourModel->extra_attributes->name = 'value';

$yourModel->extra_attributes->name; // Returns 'value'

作为替代,您可以使用数组

$yourModel->extra_attributes['name'] = 'value';

$yourModel->extra_attributes['name']; // Returns 'value'

您可以通过分配所需的数组来替换所有现有的无模式 JSON 属性。

// Все существующие JSON атрибуты будут заменены
$yourModel->extra_attributes = ['name' => 'value'];
$yourModel->extra_attributes->all(); // Returns ['name' => 'value']

您还可以使用 getset 方法。这些方法支持通过点进行记录。

$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'

保存 JSON 属性

为了保存 JSON 属性,您应该在模型中像常规属性一样调用 save()

$yourModel->save(); // Сохраняет как обычные, так и JSON атрибуты

获取具有特定 JSON 属性的模型

以下是使用提供 modelScope 的方法。

// Возвращает все модели, которые имеют все заданные JSON атрибуты.
$yourModel->withExtraAttributes(['name' => 'value', 'name2' => 'value2'])->get();

如果您只想通过一个 JSON 属性进行搜索,您可以使用 modelScope 如此操作。

// возвращает все модели, у которых для JSON атрибута `name` установлено значение `value`
$yourModel->withExtraAttributes('name', 'value')->get();

此外,如果您想使用自定义运算符通过一个 JSON 属性进行搜索,您可以使用 modelScope 如此操作。

// возвращает все модели, у которых есть JSON атрибут `name`, начинающийся со `value`
$yourModel->withExtraAttributes('name', 'LIKE', 'value%')->get();

如果您只想通过一个嵌套 JSON 属性进行搜索,您可以使用 modelScope 如此操作。

// возвращает все модели, у которых для вложенного JSON атрибута han.side установлено значение `light`
$yourModel->withExtraAttributes('han->side', 'light')->get();

测试

首先创建一个名为 darklyy_json_attributes 的 MySQL 数据库。然后,您可以使用以下命令运行测试

composer test

许可

MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件