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:
有时候,在使用模型时需要获得这些属性。您可以获得一个元数据实例:
~~~
<?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);
~~~
#### 缓存元数据(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的依赖项,从服务容器请求元数据管理器:
~~~
<?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;
};
~~~
#### 元数据策略(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:
您可以以下方式更改默认的元数据内省:
~~~
<?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;
};
~~~
#### 数据库内部策略(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:
该策略使用注释来描述模型中的列:
~~~
<?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;
}
~~~
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:
注释策略可以这样设置:
~~~
<?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;
};
~~~
#### 自定义元数据(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:
下面的例子展示了如何手动定义元数据:
~~~
<?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
- 安装
- XAMPP 下的安装
- WAMP 下安装
- Apache 安装说明
- Nginx 安装说明
- Cherokee 安装说明
- 使用 PHP 内置 web 服务器
- Phalcon 开发工具
- Windows 系统下使用 Phalcon 开发工具
- Mac OS X 系统下使用 Phalcon 开发工具
- Linux 系统下使用 Phalcon 开发工具
- 教程 1:让我们通过例子来学习
- 教程 2:INVO简介
- 教程 3: 保护INVO
- 教程4: 使用CRUD
- 教程5: 定制INVO
- 教程6: Vökuró
- 教程 7:创建简单的 REST API
- 依赖注入与服务定位器(Dependency Injection/Service Location)
- MVC 架构(The MVC Architecture)
- 使用控制器(Using Controllers)
- 使用模型(Working with Models)
- 模型关系(Model Relationships)
- 模型事件(Model Events)
- 模型行为(Model Behaviors)
- 模型元数据(Models Metadata)
- 事务管理(Model Transactions)
- 模型验证(Validating Models)
- Working with Models (Advanced)
- Phalcon 查询语言(Phalcon Query Language (PHQL))
- 缓存对象关系映射(Caching in the ORM)
- 对象文档映射 ODM (Object-Document Mapper)
- 使用视图(Using Views)
- 视图助手 (Tags)(View Helpers (Tags))