darkeum / darklyy-json-attributes
为 Darklyy 模型添加 JSON 属性。
Requires
- php: ^8.0
- darkeum/darklyy-package-tools: ^1.0.0
- illuminate/contracts: ^7.0|^8.0|^9.0
- illuminate/database: ^7.0|^8.0|^9.0
- illuminate/support: ^7.0|^8.0|^9.0
Requires (Dev)
- brianium/paratest: ^6.2
- mockery/mockery: ^1.4
- nunomaduro/collision: ^5.3|^6.0
- orchestra/testbench: ^6.15|^7.0
- phpunit/phpunit: ^9.5.4
README
如果 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']
您还可以使用 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();
测试
首先创建一个名为 darklyy_json_attributes 的 MySQL 数据库。然后,您可以使用以下命令运行测试
composer test
许可
MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件。