[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管理
- 請求環境
- 返回響應
- 安全
- 加密/解密
- 安全
- 國際化
- 國際化
- 多語言支持