定制 darkeum/darklyy-json-attributes 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

darkeum/darklyy-json-attributes

Composer 安装命令:

composer require darkeum/darklyy-json-attributes

包简介

Добавляет JSON атрибуты в модели Darklyy.

README 文档

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 атрибуты. Вы должны использовать метод jsonAttributes в Blueprint, чтобы добавить столбец. Аргумент, который вы даете 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']

Вы также можете использовать 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'

Сохранение 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();

Тестирование

Сначала создайте базу данных MySQL с именем darklyy_json_attributes. После этого вы можете запустить тесты с помощью:

composer test

Лицензия

The MIT License (MIT). Смотрите License File для получения дополнительной информации.

darkeum/darklyy-json-attributes 适用场景与选型建议

darkeum/darklyy-json-attributes 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 66 次下载、GitHub Stars 达 0, 最近一次更新时间为 2022 年 06 月 02 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「darkeum」 「darklyy」 「darklyy-json-attributes」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 darkeum/darklyy-json-attributes 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 darkeum/darklyy-json-attributes 我们能提供哪些服务?
定制开发 / 二次开发

基于 darkeum/darklyy-json-attributes 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 66
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 7
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2022-06-02