Laravel Metable:模型自定義元數據擴充套件

套件簡介

Metable 是由 Plank 開發的 Laravel 套件,用於 在不修改原有資料表結構的情況下,為 Eloquent 模型添加一對多的元數據(metadata)擴充能力

這個功能的概念類似 WordPress 的 post_metauser_meta,讓你可以為每筆資料動態地擴充額外的鍵值資料,而不需要調整資料表欄位。

適用場景

  • 動態屬性擴充:對不同的資料記錄存放不同的額外屬性,避免每個屬性都建立一個欄位。
  • 自定義欄位:依照用戶需求儲存客製化欄位資料。
  • 靈活性與可擴充性:不需更動資料表結構即可新增或修改屬性。
  • 多租戶或多配置支援:可用於儲存使用者特定的設定、偏好值等資訊。

安裝套件

composer require plank/metable

✅ 最新版本支援 Laravel 10。


模型中引入 Metable Trait

use Illuminate\Database\Eloquent\Model;
use Plank\Metable\Metable;

class YourModel extends Model
{
    use Metable;

    // 其他模型邏輯...
}

基本使用範例

$model = YourModel::find(1);

// 儲存元數據(key-value)
$model->setMeta('key', 'value');

// 讀取元數據
$value = $model->getMeta('key');

// 檢查是否存在某個 meta key
$hasMeta = $model->hasMeta('key'); // 回傳 true 或 false

// 刪除 meta key
$model->removeMeta('key');

範例:在 Post 模型中儲存標籤

use Illuminate\Database\Eloquent\Model;
use Plank\Metable\Metable;

class Post extends Model
{
    use Metable;

    protected $fillable = ['title', 'content'];
}
// 查找文章
$post = Post::find(1);

// 儲存一組標籤元數據
$post->setMeta('tags', ['technology', 'programming']);

// 取得元數據
$tags = $post->getMeta('tags');

// 更新元數據
$post->setMeta('tags', ['php', 'laravel']);

// 刪除元數據
$post->removeMeta('tags');

資料結構說明

安裝後套件會自動建立一個關聯的 meta 資料表來儲存資料,格式如下:

欄位名稱 說明
id 主鍵
metable_id 關聯模型的 ID(多型關聯)
metable_type 關聯模型的類別(多型關聯)
key Metadata 的鍵
value Metadata 的值
type 儲存資料的原始類型(JSON 等)
created_at 建立時間
updated_at 更新時間

補充:批次處理與搜尋

// 取得特定 meta key 有指定值的模型
$posts = Post::whereHasMeta('tags', 'laravel')->get();

// 模糊比對
$posts = Post::whereMeta('tags', 'like', '%laravel%')->get();

參考資源