centrex/laravel-model-data
Composer 安装命令:
composer require centrex/laravel-model-data
包简介
Add virtual columns in any model of laravel
README 文档
README
Serialize arbitrary attributes that don’t have dedicated columns into a JSON data field stored in a polymorphic model_datas table.
This package allows you to:
- Store flexible, schema-less data per model
- Access virtual attributes like native Eloquent properties
- Keep your core tables clean while supporting dynamic fields
- Use deterministic 32-character keys for efficient indexing
✨ Features
- Transparent virtual attributes ($model->color)
- External storage via polymorphic model_datas table
- Deterministic 32-char hashed keys (md5)
- Supports multiple data namespaces via data_type
- Fully compatible with Eloquent casting
- Query support for JSON attributes
📦 Installation
composer require centrex/laravel-model-data
php artisan vendor:publish --tag="model-data-migrations"
php artisan migrate
Usage
1. Add the trait to your model
use Centrex\ModelData\Concerns\HasModelData; class Product extends Model { use HasModelData; }
2. Virtual Attributes (Transparent Mode)
$product = Product::create(['name' => 'Widget']); // Assign attributes that don't exist as columns $product->color = 'red'; $product->weight = 1.5; $product->is_featured = true; $product->save();
// Retrieve — fully transparent, works like regular attributes
$product = Product::find(1); echo $product->color; // red echo $product->weight; // 1.5 echo $product->is_featured; // true
3. Structured Data (Explicit Mode)
You can also store grouped data explicitly:
$product->putData('settings', [ 'currency' => 'USD', 'stock_alert' => true, ]); $product->putData('seo', [ 'title' => 'Best Product', 'description' => 'Top quality item', ]);
Retrieve
$settings = $product->getData('settings'); $currency = $product->getDataValue('settings', 'currency');
4. Check / Delete
$product->hasData('settings'); // true $product->forgetData('settings'); // deletes record
5. Query Virtual Attributes
$column = (new Product())->getColumnForQuery('color'); Product::whereRaw("{$column} = ?", ['red'])->get();
6. Casting Support
Works seamlessly with Laravel casts:
protected $casts = [ 'is_featured' => 'boolean', 'tags' => 'array', ];
⚙️ How It Works
Storage Model
Each record in model_datas represents:
model_type + model_id + data_type → unique key (md5)
Example:
Product|15|settings → md5 → 32-char key
Data Structure
{
"color": "red",
"weight": 1.5,
"is_featured": true
}
🧠 Design Modes
1. Transparent Mode (default)
- Works like native attributes
- Best for dynamic fields
$product->color = 'red';
2. Explicit Mode (recommended for structure)
- Namespaced data storage
- Better for large systems (ERP, SaaS)
$product->putData('settings', [...]);
🏗️ Advanced Usage
Multiple Data Types
$product->putData('pricing', [...]); $product->putData('inventory', [...]); $product->putData('analytics', [...]);
Each stored separately but linked to the same model.
Access Nested Values
$product->getDataValue('settings', 'notifications.email');
⚡ Performance Notes
- Primary key is fixed 32-char string
- Indexed for fast lookup
- No joins required for simple access
- JSON queries supported natively (MySQL / PostgreSQL)
⚠️ Best Practices
- Prefer explicit mode for complex systems
- Avoid overloading with deeply nested JSON
- Keep frequently queried fields as real columns
🧪 Testing
composer test # full suite composer test:unit # pest only composer test:types # phpstan composer lint # pint
🔄 Migration Strategy (from inline JSON)
If you're migrating from a data column:
- Move JSON to model_datas
- Drop old column
- Add trait
- Done
Changelog
Please see CHANGELOG for more information on what has changed recently.
Credits
License
The MIT License (MIT). Please see License File for more information.
centrex/laravel-model-data 适用场景与选型建议
centrex/laravel-model-data 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1.85k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2023 年 11 月 16 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「laravel」 「laravel-model-data」 「centrex」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 centrex/laravel-model-data 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 centrex/laravel-model-data 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 centrex/laravel-model-data 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Manage settings in laravel
Manage address in laravel
This is my package laravel-open-exchange-rates
This is my package tallui
Payroll package for laravel
Manage fishing and other optional security matters
统计信息
- 总下载量: 1.85k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 15
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2023-11-16