drhtoo / laravel-metafield
Laravel MetaField
v1.0.0
2023-05-10 10:58 UTC
Requires
- php: ^7.3|^8.0
Requires (Dev)
- orchestra/testbench: ^7.0|^8.0
README
Laravel Metafield 包允许您为 Laravel Eloquent 模型添加自定义元字段。当您需要存储关于模型的基本属性之外的数据时,这很有用。
安装
要安装此包,您可以简单地运行以下 Composer 命令
composer require drhtoo/laravel-metafield
发布配置和迁移(可选)
安装包后,您可以选择发布包的配置和迁移到您的 Laravel 应用程序。您可以通过运行以下命令来完成此操作
php artisan vendor:publish --provider="Drhtoo\MetaField\LaravelMetaFieldServiceProvider"
迁移发布后,您可以使用以下命令运行它们
php artisan migrate
使用方法
要开始使用 Laravel Metafield 包,您需要将 HasMeta 特性添加到任何您希望具有元字段的 Eloquent 模型。以下是一个示例
// Product.php
use Drhtoo\MetaField\Models\Concerns\HasMeta;
class Product extends Model
{
use HasMeta;
}
现在,您可以通过使用关系 metas 来使用相关的元字段
$product = Product::find(1);
$product->metas->price = 100;
echo $product->metas->price; // 100
MetaFields 属性
要将元字段用作模型属性,您需要在模型中添加 $metaFields 属性。它是一个数组类型的受保护属性,其默认值是按字段/键索引的。
// Product.php
use Drhtoo\MetaField\Models\Concerns\HasMeta;
class Product extends Model
{
use HasMeta;
protected $metaFields = [
'price' => null,
'is_sale' => false,
'sale_price' => null,
'color' => 'white',
];
}
$product = Product::find(1);
$product->price = 100;
echo $product->price; // 100
属性转换
您也可以将元字段转换为 Eloquent/Model 的属性。
// Product.php
use Drhtoo\MetaField\Models\Concerns\HasMeta;
class Product extends Model
{
use HasMeta;
protected $metaFields = [
'price' => null,
'is_sale' => false,
'sale_price' => null,
'color' => null,
'sale_start' => null,
'sale_end' => null,
];
protected $casts = [
'price' => 'decimal:2',
'sale_price' => 'decimal:2',
'color' => 'array',
'sale_start' => 'datetime',
'sale_end' => 'datetime',
];
}
$product = Product::find(1);
$product->price = 100;
echo $product->price; // 100
与 Livewire 组件一起使用
此包与 Livewire 组件兼容良好,并直接绑定到 wire:model 属性。要使 Livewire 组件能够找到元字段属性,您需要将字段追加到模型属性中。
// Product.php
use Drhtoo\MetaField\Models\Concerns\HasMeta;
class Product extends Model
{
use HasMeta;
protected $metaFields = [
'price' => null,
'is_sale' => false,
'sale_price' => null,
'color' => null,
'sale_start' => null,
'sale_end' => null,
];
protected $appends = [
'price', 'is_sale', 'sale_price', 'color', 'sale_start', 'sale_end'
];
}
// Livewire component blade view
<input type="number" wire:model="product.price" />
@error('product.price')
<span class="error">{{ $message }}</span>
@enderror
与 Spatie 的 Laravel-translatable 包一起使用
Laravel Meta Field 与 spatie/laravel-translatable 包兼容良好,您只需简单地将元字段的数组项添加到模型的 $translatable 属性中,并使用 HasMeta 特性的 setAttribute 方法代替 Translatable。
// Product.php
use Drhtoo\MetaField\Models\Concerns\HasMeta;
class Product extends Model
{
use HasMeta {
HasMeta::setAttribute insteadof HasTranslations;
}
protected $attributes = [
'title' => null,
'description' => null,
];
protected $metaFields = [
'price' => null,
'is_sale' => false,
'sale_price' => null,
'sale_description' => null,
];
public $translatable = [
'title',
'description',
'sale_description'
];
}
$product = Product::find(1);
$product->sale_description = 'This is sale product'; // set value to current locale
$product->setTranslation('sale_description', 'es', 'Este es un producto de venta');
就这些了。祝您玩得开心。