[TOC]
# 模型元数据
为了加速开发,`Phalcon\Mvc\Model` 可以帮助您查询与模型相关的表中的字段和约束。为此,`Phalcon\Mvc\Model\MetaData` 可用于管理和缓存表元数据。
有时在使用模型时需要获取这些属性。您可以按如下方式获取元数据实例:
```php
<?php
$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);
```
## 缓存元数据
一旦应用程序处于生产阶段,就不必在每次使用表时从数据库系统中查询表的元数据。这可以使用以下任何适配器来缓存元数据:
| 适配器 | 描述 | API |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------- |
| Apc | 此适配器使用[Alternative PHP Cache (APC)](http://www.php.net/manual/en/book.apc.php)来存储表元数据。您可以使用选项指定元数据的生存期。(推荐用于生产)。 | `Phalcon\Mvc\Model\MetaData\Apc` |
| Files | 此适配器使用纯文件来存储元数据。此适配器可减少数据库查询,但文件系统的I/O增加。 | `Phalcon\Mvc\Model\MetaData\Files` |
| Libmemcached | 此适配器使用[Memcached Server](https://www.memcached.org/)来存储表元数据。服务器参数以及缓存生存期在选项中指定。(推荐用于生产) | `Phalcon\Mvc\Model\MetaData\Libmemcached` |
| Memcache | 此适配器使用[Memcache](http://php.net/manual/en/book.memcache.php)存储表元数据。您可以使用选项指定元数据的生存期。(推荐用于生产) | `Phalcon\Mvc\Model\MetaData\Memcache` |
| Memory | 此适配器是默认值。仅在请求期间缓存元数据。请求完成后,元数据将作为请求的正常内存的一部分释放。(推荐用于开发) | `Phalcon\Mvc\Model\MetaData\Memory` |
| Redis | 此适配器使用[Redis](https://redis.io/)存储表元数据。服务器参数以及缓存生存期在选项中指定。(推荐用于生产)。 | `Phalcon\Mvc\Model\MetaData\Redis` |
| Session | 此适配器将元数据存储在`$_SESSION`超全局中。仅当应用程序实际使用少量模型时,才建议使用此适配器。每次新会话开始时都会刷新元数据。这还需要使用 `session_start()` 在使用任何模型之前启动会话。 | `Phalcon\Mvc\Model\MetaData\Session` |
| XCache | 此适配器使用[XCache](http://xcache.lighttpd.net/)存储表元数据。您可以使用选项指定元数据的生存期。这是在应用程序投入生产时存储元数据的推荐方法之一。 | `Phalcon\Mvc\Model\MetaData\Xcache` |
与其他ORM的依赖项一样,从服务容器请求元数据管理器:
```php
<?php
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;
};
```
## 元数据策略
如上所述,获取模型元数据的默认策略是数据库内部。在此策略中,信息模式用于了解表中的字段,主键,可空字段,数据类型等。
您可以通过以下方式更改默认元数据内省:
```php
<?php
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;
};
```
### 数据库内省策略
此策略不需要任何自定义,并且由所有元数据适配器隐式使用。
### 注解策略
此策略使用注释`annotations <annotations>`来描述模型中的列:
```php
<?php
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;
}
```
注解必须放在映射到映射源中的列的属性中。没有`@Column`注解的属性将作为简单的类属性处理。
支持以下注解:
| 名称 | 描述 |
| -------- | ------------------------------------------------- |
| Primary | 将该字段标记为表的主键的一部分 |
| Identity | 该字段是auto_increment/serial列 |
| Column | 这将属性标记为映射列 |
注解`@Column`支持以下参数:
| 名称 | 描述 |
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| column | 真正的列名 |
| type | 列的类型:varchar/string(默认值),text,char,json,tinyblob,blob,mediumblob,longblob,integer,biginteger,float,decimal,date,datetime,timestamp,boolean|
| length | 列的长度(如果有) |
| nullable | 设置列是否接受null值 |
| skip_on_insert | 在插入时跳过此列 |
| skip_on_update | 在更新时跳过此列 |
| allow_empty_string | 列允许空字符串 |
| default | 默认值 |
注解策略可以这样设置:
```php
<?php
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;
};
```
## 手动定义元数据
Phalcon可以自动获取每个模型的元数据,而开发人员必须使用上面提到的任何内省策略手动设置它们。
开发人员还可以选择手动定义元数据。此策略将覆盖元数据管理器中设置的任何策略。必须添加/修改/删除在映射表中添加/修改/删除的新列,以使一切正常工作。
以下示例显示如何手动定义元数据:
```php
<?php
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,
],
);
}
}
```
- 常规
- Welcome
- 贡献
- 生成回溯
- 测试重现
- 单元测试
- 入门
- 安装
- Web服务器设置
- WAMP
- XAMPP
- 教程
- 基础教程
- 教程:创建一个简单的REST API
- 教程:Vökuró
- 提升性能
- 教程:INVO
- 开发环境
- Phalcon Compose (Docker)
- Nanobox
- Phalcon Box (Vagrant)
- 开发工具
- Phalcon开发者工具的安装
- Phalcon开发者工具的使用
- 调试应用程序
- 核心
- MVC应用
- 微应用
- 创建命令行(CLI)应用程序
- 依赖注入与服务定位
- MVC架构
- 服务
- 使用缓存提高性能
- 读取配置
- 上下文转义
- 类加载器
- 使用命名空间
- 日志
- 队列
- 数据库
- 数据库抽象层
- Phalcon查询语言(PHQL)
- ODM(对象文档映射器)
- 使用模型
- 模型行为
- ORM缓存
- 模型事件
- 模型元数据
- 模型关系
- 模型事务
- 验证模型
- 数据库迁移
- 分页
- 前端
- Assets管理
- 闪存消息
- 表单
- 图像
- 视图助手(标签)
- 使用视图
- Volt:模板引擎
- 业务逻辑
- 访问控制列表(ACL)
- 注解解析器
- 控制器
- 调度控制器
- 事件管理器
- 过滤与清理
- 路由
- 在session中存储数据
- 生成URL和路径
- 验证
- HTTP
- Cookies管理
- 请求环境
- 返回响应
- 安全
- 加密/解密
- 安全
- 国际化
- 国际化
- 多语言支持