目录

Meta使用

在将meta附加到Eloquent模型之前,必须先将Metable特征添加到您的Eloquent模型中。

<?php

namespace App;

use Royalcms\Component\Metable\Metable;
use Royalcms\Component\Database\Eloquent\Model;

class Page extends Model
{
        use Metable;

        // ...
}

添加元数据

使用setMeta()方法将meta附加到模型。 该方法接受两个参数:用作键的字符串和值。 value参数将接受许多不同的输入,这些输入将转换为字符串以存储在数据库中。 请参阅支持的列表:datatypes

<?php
$model->setMeta('key', 'value');

要一次设置多个元键和值对,可以将关联数组或集合传递给syncMeta()。

<?php
$model->syncMeta([
        'name' => 'John Doe',
        'age' => 18,
]);

检索元数据

您可以使用getMeta()方法检索给定键的元数值。 应以与存储的格式相同的格式返回该值。 例如,如果设置了数组,则在检索数组时将返回一个数组。

<?php

$model->setMeta('age', 18);
$model->setMeta('approved', true);
$model->setMeta('accessed_at', Carbon::now());

//reload the model from the database
$model = $model->fresh();

$age = $model->getMeta('age'); //returns an integer
$approved = $model->getMeta('approved'); //returns a boolean
$accessDate = $model->getMeta('accessed_at'); //returns a Carbon instance

//etc.

您可以将第二个参数传递给方法,以指定在该键未设置元数据时返回的默认值。

<?php
$model->getMeta('status', 'draft');
备注

如果已为该键手动设置了falsey值(例如0,false,null,’‘),则将返回该值而不是默认值。 仅当元键值中不存在元时,才会返回默认值。

一次加载后,附加到模型实例的所有元都将缓存在模型的元关系中。 因此,对getMeta()的连续调用不会重复命中数据库。

类似地,每个元的反序列化值一旦被访问就被缓存。 这对于附加:eloquent_models和类似的依赖于数据库的对象特别相关。

为元键值设置新值会自动更新所有缓存。

检索所有元数据

要检索附加到模型的所有元的集合(表示为键和值对),请使用getAllMeta()。

<?php
$meta = $model->getAllMeta();

检查元数据存在

您可以使用hasMeta()方法检查是否已将值分配给给定键。

<?php
if ($model->hasMeta('background-color')) {
        // ...
}
备注

即使已为该键手动设置了falsey值(例如0,false,null,’‘),此方法也将返回true。

删除元数据

要删除存储在给定键中的元数据,请使用removeMeta()。

<?php
$model->removeMeta('prefered_language');

要从模型中删除所有元数据,请使用purgeMeta()。

<?php
$model->purgeMeta();

手动删除Metable模型时,会自动从数据库中清除附加的元数据。 如果查询构建器删除了模型,则不会级联Meta。

<?php
$model->delete(); // will delete attached meta
MyModel::where(...)->delete() // will NOT delete attached meta

加载元数据

使用Metable模型的集合时,请务必将所有实例的元关系一起加载,以避免重复的数据库查询(即N + 1问题)。

来自查询构建器的即时加载:

<?php
$models = MyModel::with('meta')->where(...)->get();

来自Eloquent系列的懒人加载:

<?php
$models->load('meta');

您还可以通过向模型的$with属性添加“meta”来指示模型类始终急切加载元关系。

<?php

class MyModel extends Model {
    use Metable;

    protected $with = ['meta'];
}