denismitr / laravel-json-attributes
Laravel Json Attributes for Eloquent Models
v2.0
2019-07-20 20:45 UTC
Requires
- php: >=7.2
- illuminate/database: ~5.7.0|~5.8.0
- illuminate/support: ~5.7.0|~5.8.0
Requires (Dev)
- larapack/dd: ^1.1
- orchestra/testbench: ~3.7.0|~3.8.0
- phpunit/phpunit: ^7.3
This package is auto-updated.
Last update: 2024-09-21 20:38:56 UTC
README
作者
Denis Mitrofanov
thecollection.ru
要求
PHP 7.2或更高版本,MYSQL 5.7或更高版本,或POSTGRES(我在9.6上测试过,可能任何9.*版本或更高版本都可以)
安装
composer require denismitr/laravel-json-attributes
在Laravel 5.5中,服务提供程序将自动注册。在框架的旧版本中,只需在config/app.php
文件中添加服务提供程序
'providers' => [
// ...
Denismitr\JsonAttributes\JsonAttributesServiceProvider::class,
];
使用方法
- 首先将一个
jsonData
列添加到您的表中
Schema::create('orders', function (Blueprint $table) { $table->increments('id'); $table->string('description'); $table->jsonData('json_data'); });
在$table->jsonData('json_data');
下面,只是$table->json('json_data')->nullable()
。
使用示例
$array = [ 'supplier' => 'Boeing', 'total_cost' => 245.99, ]; $record = Record::create(['json_data' => $array]); $this->assertEquals($array, $record->json_data->all()); $this->assertEquals('Boeing', $record->json_data->supplier); $this->assertEquals('Boeing', $record->json_data['supplier']);
使用Laravel点表示法的其他示例
$this->record->json_data->member = ['name' => 'John', 'age' => 30]; $this->record->json_data->forget('member.age'); $this->assertEquals($this->record->json_data->member, ['name' => 'John']);
$this->record->json_data->set('settings.connection', 'mysql'); $this->record->json_data->set('colors.navbar', 'dark'); $this->assertEquals('mysql', $this->record->json_data->get('settings.connection')); $this->assertEquals('dark', $this->record->json_data->get('colors.navbar'));
您可以为整个数组分配值
$array = [ 'one' => 'value', 'two' => 'another value', ]; $this->record->json_data->array = $array; $this->assertEquals($array, $this->record->json_data->array);
搜索
从版本1.0
开始,嵌套搜索可用
$recordA = Record::create(['json_data' => [ 'company' => 'Ecommelite', 'user' => [ 'name' => 'Denis', 'job_title' => 'developer' ] ]]); $recordB = Record::create(['json_data' => [ 'company' => 'Ecommelite', 'user' => [ 'name' => 'Tom', 'job_title' => 'developer' ] ]]); $recordC = Record::create(['json_data' => [ 'company' => 'Ecommelite', 'address' => [ 'street' => '1st Street', 'phone' => 1234556 ] ]]); $this->assertContainsModels( [$recordA], Record::withJsonData(['user.name' => 'Denis'])->get() ); $this->assertContainsModels( [$recordA, $recordB], Record::withJsonData(['user.job_title' => 'developer'])->get() ); $this->assertContainsModels( [$recordA, $recordB], Record::withJsonData(['user.job_title' => 'developer', 'company' => 'Ecommelite'])->get() ); $this->assertContainsModels( [$recordA], Record::withJsonData([ 'user.job_title' => 'developer', 'company' => 'Ecommelite', 'user.name' => 'Denis' ])->get() ); $this->assertContainsModels( [$recordA, $recordB], Record::withJsonData('user.job_title', 'developer')->get() ); $this->assertContainsModels( [], Record::withJsonData(['non.existent' => 'record'])->get() );
要了解更多信息,请查看测试。
Eloquent模型
首先,您需要将json属性转换为数组。以下是从测试套件中的Record
模型的样子
use Denismitr\JsonAttributes\JsonAttributes; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; class Record extends Model { protected $casts = ['json_data' => 'array']; /** * @return JsonAttributes */ public function getJsonDataAttribute(): JsonAttributes { return JsonAttributes::create($this, 'json_data'); } /** * @return Builder */ public function scopeWithJsonData(): Builder { return JsonAttributes::scopeWithJsonAttributes('json_data'); } }
持久性像任何其他Eloquent模型一样正常工作