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,

],

);

}

}

~~~

php中metadata,模型元数据(Models Metadata)相关推荐

  1. 清除PSD文件中多余的元数据(Metadata)

    有时候从网上找到一个巨大的图片模板之后,保存出来的jpg文件也会是个几百兆的大文件--原因也很简单,因为PSD文件之间互相复制粘贴会在对应文件的XMP元数据里记录下操作数据,也就是这个图像是从哪儿来的 ...

  2. Mysql 死锁过程及案例详解之元数据锁MetaData Lock

    Mysql数据锁MetaData Lock 元数据锁MetaData Lock 元数据锁MetaData Locks的主要作用是在执行查询或者发起事务时元数据结构受到保护,即不被修改. MetaDat ...

  3. java数据库编程——元数据(metadata)+web 与企业应用中的连接管理

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java数据库编程--元数据(metadata)+web 与企业应用中的连接管 ...

  4. WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[WS标准篇]

    元数据实际上是服务终结点的描述,终结点由地址(Address).绑定(Binding)和契约(Contract)经典的ABC三要素组成.认真阅读过<WCF技术剖析(卷1)>的读者相对会对这 ...

  5. 【收藏】关于元数据(Metadata)和元数据管理,这是我的见过最全的解读!

    本文主要从元数据的定义.作用.元数据管理现状.管理标准和元数据管理功能等方面讲述了我对元数据(Metadata)和元数据管理的认知及理解. 元数据管理 一.元数据的定义 按照传统的定义,元数据(Met ...

  6. SharePoint 2010 新体验7 - Managed Metadata (托管元数据)

    在一个企业中,有时候需要一个专门的Metadata库,用来保存各种预定义的Metadata.有了Metadata库,就能方便的为企业中的各种数字内容.数字资产应用上各种定义好的Metadata,或是用 ...

  7. MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)

    MEF中使用导出与导入,实质上就是对一个对象的实例化的过程,通过MEF的特性降低了对象的直接依赖,从而让系统的设计达到一种高灵活.高扩展性的效果.在具体的设计开发中,存在着某些对象是不需要在系统运行或 ...

  8. 【转】MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)...

    MEF中使用导出与导入,实质上就是对一个对象的实例化的过程,通过MEF的特性降低了对象的直接依赖,从而让系统的设计达到一种高灵活.高扩展性的效果.在具体的设计开发中,存在着某些对象是不需要在系统运行或 ...

  9. MEF:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)

    MEF中使用导出与导入,实质上就是对一个对象的实例化的过程,通过MEF的特性降低了对象的直接依赖,从而让系统的设计达到一种高灵活.高扩展性的效果.在具体的设计开发中,存在着某些对象是不需要在系统运行或 ...

最新文章

  1. python 2x xlrd使用merged_cells 读取的合并单元格为空
  2. Python 学习笔记: 反射
  3. hdfs dfs的bash hdfs command not found解决方案
  4. 082_html5Web存储
  5. eBay的Elasticsearch性能调优实践
  6. 深度学习(二十二)——ESPCN, FSRCNN, VESPCN, SRGAN, DemosaicNet, MemNet, RDN, ShuffleSeg
  7. 多元时代个人信息更需强有力保护
  8. 谷歌2007年上交大考试最后一题解答
  9. YBTOJ洛谷P4298:祭祀(二分图匹配)
  10. PHP中怎样实现正负数的相加,PHP 求任意n个正负整数里面最大的连续和
  11. 遭遇 XSS 跨站脚本攻击?稳住,这些方法可保你渡劫 | 附代码、图解
  12. python语言单词接龙_[蓝桥杯][算法训练VIP]单词接龙 (C语言代码)
  13. linux下隐藏tomcat版本号
  14. fft和freqz的区别
  15. Syzmlw 蜗居大结局f
  16. 乾隆的太医留下来的民间偏方
  17. 英雄联盟爬取不同英雄皮肤
  18. iOS事件传递链与响应链
  19. Redis系列-存储篇list主要操作函数小结
  20. 基于GUI的AWT,Swing写的一个餐厅点菜系统

热门文章

  1. 书店POS机--细化迭代2--测试
  2. PHP源码安装及配置——以fastCGI的方式与httpd整合
  3. Redo Log 和Checkpoint not complete
  4. 【讨论】从吉日的一段话说起+寻找WinForm架构的最佳实践
  5. CSDN登陆校验码模式识别程序
  6. linux无法下载ftp,linux 不能下载怎么办
  7. 哈维玛德学院 计算机,这些美国大学名气不高,却有最顶级的工程专业
  8. FYFG的完整形式是什么?
  9. 算法导论 算法_算法导论
  10. ruby hash方法_Ruby中带有示例的Hash.rassoc(obj)方法