php中metadata,模型元数据(Models Metadata)

To speed up development Phalcon\Mvc\Model helps you to query fields and constraints from tables related to models. To achieve this, Phalcon\Mvc\Model\MetaData is available to manage and cache table metadata.

Phalcon\Mvc\Model 能帮助你查询字段从表关联到模型和约束从而加快你的开发效率。为了达到这个目标, Phalcon\Mvc\Model\MetaData元数据管理和缓存表的元数据是有必要的。

Sometimes it is necessary to get those attributes when working with models. You can get a metadata instance as follows:

有时候,在使用模型时需要获得这些属性。您可以获得一个元数据实例:

~~~

$robot = new Robots();

// Get Phalcon\Mvc\Model\Metadata instance

$metadata = $robot->getModelsMetaData();

// Get robots fields names

$attributes = $metadata->getAttributes($robot);

print_r($attributes);

// Get robots fields data types

$dataTypes = $metadata->getDataTypes($robot);

print_r($dataTypes);

~~~

#### 缓存元数据(Caching Metadata)

Once the application is in a production stage, it is not necessary to query the metadata of the table from the database system each time you use the table. This could be done caching the metadata using any of the following adapters:

一旦应用程序处于生产阶段,就不需要在每次使用该表时从数据库系统查询表的元数据。可以使用以下任何一个适配器来缓存元数据:

| Adapter 适配器 | Description 描述 | API |

| --- | --- | --- |

| Memory 内存 | This adapter is the default. The metadata is cached only during the request. When the request is completed, the metadata are released as part of the normal memory of the request. This adapter is perfect when the application is in development so as to refresh the metadata in each request containing the new and/or modified fields. 这个适配器是默认的。元数据仅在请求期间被缓存。当请求完成时,元数据作为请求的正常内存的一部分被释放。当应用程序处于开发阶段时,该适配器是完美的,以便在包含新/或修改字段的每个请求中刷新元数据。 | Phalcon\Mvc\Model\MetaData\Memory |

| Session 会话 | This adapter stores metadata in the `$_SESSION `superglobal. This adapter is recommended only when the application is actually using a small number of models. The metadata are refreshed every time a new session starts. This also requires the use of `session_start()` to start the session before using any models. 该适配器将元数据存储在$SESSION超全局中。只有当应用程序实际使用少量的模型时,才推荐这个适配器。每次新会话开始时,元数据都会刷新。这还需要使用sessionstart()在使用任何模型之前,先启动会话。 | Phalcon\Mvc\Model\MetaData\Session |

| Apc | This adapter uses the Alternative PHP Cache (APC) to store the table metadata. You can specify the lifetime of the metadata with options. This is the most recommended way to store metadata when the application is in production stage. 这个适配器使用另一个PHP缓存(APC)来存储表元数据。您可以使用选项指定元数据的生命周期。当应用程序处于生产阶段时,这是最推荐的存储元数据的方法。 | Phalcon\Mvc\Model\MetaData\Apc |

| XCache | This adapter uses XCache to store the table metadata. You can specify the lifetime of the metadata with options. This is the most recommended way to store metadata when the application is in production stage. 这个适配器使用XCache来存储表元数据。您可以使用选项指定元数据的生命周期。当应用程序处于生产阶段时,这是最推荐的存储元数据的方法。 | Phalcon\Mvc\Model\MetaData\Xcache |

| Files | This adapter uses plain files to store metadata. By using this adapter the disk-reading is increased but the database access is reduced. 该适配器使用普通文件存储元数据。通过使用这个适配器,磁盘读取增加了,但是数据库访问减少了。 | Phalcon\Mvc\Model\MetaData\Files |

As other ORM’s dependencies, the metadata manager is requested from the services container:

作为其他ORM的依赖项,从服务容器请求元数据管理器:

~~~

use Phalcon\Mvc\Model\MetaData\Apc as ApcMetaData;

$di["modelsMetadata"] = function () {

// Create a metadata manager with APC

$metadata = new ApcMetaData(

[

"lifetime" => 86400,

"prefix" => "my-prefix",

]

);

return $metadata;

};

~~~

#### 元数据策略(Metadata Strategies)

As mentioned above the default strategy to obtain the model’s metadata is database introspection. In this strategy, the information schema is used to know the fields in a table, its primary key, nullable fields, data types, etc.

正如上面提到的,获取模型元数据的默认策略是数据库内省。在这个策略中,信息模式用于了解表中的字段、它的主键、可空字段、数据类型等。

You can change the default metadata introspection in the following way:

您可以以下方式更改默认的元数据内省:

~~~

use Phalcon\Mvc\Model\MetaData\Apc as ApcMetaData;

$di["modelsMetadata"] = function () {

// Instantiate a metadata adapter

$metadata = new ApcMetaData(

[

"lifetime" => 86400,

"prefix" => "my-prefix",

]

);

// Set a custom metadata introspection strategy

$metadata->setStrategy(

new MyIntrospectionStrategy()

);

return $metadata;

};

~~~

#### 数据库内部策略(Database Introspection Strategy)

This strategy doesn’t require any customization and is implicitly used by all the metadata adapters.

此策略不需要任何定制,并且被所有元数据适配器隐式地使用。

#### 注释策略(Annotations Strategy)

This strategy makes use of annotations to describe the columns in a model:

该策略使用注释来描述模型中的列:

~~~

use Phalcon\Mvc\Model;

class Robots extends Model

{

/**

* @Primary

* @Identity

* @Column(type="integer", nullable=false)

*/

public $id;

/**

* @Column(type="string", length=70, nullable=false)

*/

public $name;

/**

* @Column(type="string", length=32, nullable=false)

*/

public $type;

/**

* @Column(type="integer", nullable=false)

*/

public $year;

}

~~~

Annotations must be placed in properties that are mapped to columns in the mapped source. Properties without the @Column annotation are handled as simple class attributes.

注释必须放在映射到映射源中的列的属性中。没有@column注释的属性被处理为简单的类属性。

The following annotations are supported:

下面的注释得到了支持:

| Name 名字 | Description 描述 |

| --- | --- |

| Primary | Mark the field as part of the table’s primary key 将字段标记为表的主键的一部分 |

| Identity | The field is an auto_increment/serial column 该字段是一个自动递增/串行列 |

| Column | This marks an attribute as a mapped column 它将一个属性标记为一个映射的列 |

The annotation @Column supports the following parameters:

@column的注释支持以下参数:

| Name | Description 描述 |

| --- | --- |

| type | The column’s type (string, integer, decimal, boolean) 列的类型(字符串、整数、小数、布尔) |

| length | The column’s length if any 列的长度如果有的话 |

| nullable | Set whether the column accepts null values or not 设置该列是否接受null值 |

The annotations strategy could be set up this way:

注释策略可以这样设置:

~~~

use Phalcon\Mvc\Model\MetaData\Apc as ApcMetaData;

use Phalcon\Mvc\Model\MetaData\Strategy\Annotations as StrategyAnnotations;

$di["modelsMetadata"] = function () {

// Instantiate a metadata adapter

$metadata = new ApcMetaData(

[

"lifetime" => 86400,

"prefix" => "my-prefix",

]

);

// Set a custom metadata database introspection

$metadata->setStrategy(

new StrategyAnnotations()

);

return $metadata;

};

~~~

#### 自定义元数据(Manual Metadata)

Phalcon can obtain the metadata for each model automatically without the developer must set them manually using any of the introspection strategies presented above.

如果没有开发人员必须手动使用上面介绍的任何一种内省策略,那么就可以自动为每个模型获取元数据。

The developer also has the option of define the metadata manually. This strategy overrides any strategy set in the metadata manager. New columns added/modified/removed to/from the mapped table must be added/modified/removed also for everything to work properly.

开发人员还可以手动定义元数据。该策略覆盖了元数据管理器中的任何策略。从映射表中添加/修改/删除的新列必须被添加/修改/删除,以便所有的工作都能正常工作。

The following example shows how to define the metadata manually:

下面的例子展示了如何手动定义元数据:

~~~

use Phalcon\Mvc\Model;

use Phalcon\Db\Column;

use Phalcon\Mvc\Model\MetaData;

class Robots extends Model

{

public function metaData()

{

return array(

// Every column in the mapped table

MetaData::MODELS_ATTRIBUTES => [

"id",

"name",

"type",

"year",

],

// Every column part of the primary key

MetaData::MODELS_PRIMARY_KEY => [

"id",

],

// Every column that isn't part of the primary key

MetaData::MODELS_NON_PRIMARY_KEY => [

"name",

"type",

"year",

],

// Every column that doesn't allows null values

MetaData::MODELS_NOT_NULL => [

"id",

"name",

"type",

],

// Every column and their data types

MetaData::MODELS_DATA_TYPES => [

"id" => Column::TYPE_INTEGER,

"name" => Column::TYPE_VARCHAR,

"type" => Column::TYPE_VARCHAR,

"year" => Column::TYPE_INTEGER,

],

// The columns that have numeric data types

MetaData::MODELS_DATA_TYPES_NUMERIC => [

"id" => true,

"year" => true,

],

// The identity column, use boolean false if the model doesn't have

// an identity column

MetaData::MODELS_IDENTITY_COLUMN => "id",

// How every column must be bound/casted

MetaData::MODELS_DATA_TYPES_BIND => [

"id" => Column::BIND_PARAM_INT,

"name" => Column::BIND_PARAM_STR,

"type" => Column::BIND_PARAM_STR,

"year" => Column::BIND_PARAM_INT,

],

// Fields that must be ignored from INSERT SQL statements

MetaData::MODELS_AUTOMATIC_DEFAULT_INSERT => [

"year" => true,

],

// Fields that must be ignored from UPDATE SQL statements

MetaData::MODELS_AUTOMATIC_DEFAULT_UPDATE => [

"year" => true,

],

// Default values for columns

MetaData::MODELS_DEFAULT_VALUES => [

"year" => "2015",

],

// Fields that allow empty strings

MetaData::MODELS_EMPTY_STRING_VALUES => [

"name" => true,

],

);

}

}

~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值