模型元数据(Models Meta-Data)

为了加快开发速度 Phalcon\Mvc\Model 将帮助你从数据库中查询与模型有关字段和约束。为了实现这一点将会用 Phalcon\Mvc\Model\MetaData 管理和缓存表元数据。

有时在使用模型时需要获取和字段相关的属性。获得元数据的方法,如下所示:

  1. <?php
  2.  
  3. $robot = new Robots();
  4.  
  5. // Get Phalcon\Mvc\Model\Metadata instance
  6. $metaData = $robot->getModelsMetaData();
  7.  
  8. // Get robots fields names
  9. $attributes = $metaData->getAttributes($robot);
  10. print_r($attributes);
  11.  
  12. // Get robots fields data types
  13. $dataTypes = $metaData->getDataTypes($robot);
  14. print_r($dataTypes);

缓存元数据(Caching Meta-Data)

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

Adapter Description API
Memory 这个是默认适配器,将元数据缓存在内存中。当请求完成时,元数据缓存将被释放,适合在应用程序开发阶段使用,每个请求都会重新获取字段信息 Phalcon\Mvc\Model\MetaData\Memory
Session 该适配器将元数据缓存在 $_SESSION 超全局变量中。该适配器只适合在拥有少量模型的时候使用,每次启动新的 Session 该适配器缓存就会失效。必须在 session_start() 启动 Session 之后使用 Phalcon\Mvc\Model\MetaData\Session
Apc 该适配器将使用 Alternative PHP Cache (APC) 存储元数据。可以设置 lifetime 选项。推荐在生成阶段使用该适配器 Phalcon\Mvc\Model\MetaData\Apc
XCache This adapter uses XCache to store the table meta-data. You can specify the lifetime of the meta-data with options. This is the most recommended way to store meta-data when the application is in production stage Phalcon\Mvc\Model\MetaData\Xcache
Files This adapter uses plain files to store meta-data. By using this adapter the disk-reading is increased but the database access is reduced Phalcon\Mvc\Model\MetaData\Files
Cache 使用缓存组件,将元数据存储在缓存组件对应的存储服务器中 Phalcon\Mvc\Model\MetaData\Cache

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

  1. <?php
  2.  
  3. use Phalcon\Mvc\Model\MetaData\Apc as ApcMetaData;
  4.  
  5. $di['modelsMetadata'] = function () {
  6.  
  7. // Create a meta-data manager with APC
  8. $metaData = new ApcMetaData(
  9. array(
  10. "lifetime" => 86400,
  11. "prefix" => "my-prefix"
  12. )
  13. );
  14.  
  15. return $metaData;
  16. };

自定义元数据缓存 KEY

  1. <?php
  2.  
  3. class Robots extends Phalcon\Mvc\Model {
  4.  
  5. public function getMetadataCachekey() {
  6. return 'Robots-robots';
  7. }
  8. }

元数据策略(Meta-Data Strategies)

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

You can change the default meta-data introspection in the following way:

  1. <?php
  2.  
  3. use Phalcon\Mvc\Model\MetaData\Apc as ApcMetaData;
  4.  
  5. $di['modelsMetadata'] = function () {
  6.  
  7. // Instantiate a meta-data adapter
  8. $metaData = new ApcMetaData(
  9. array(
  10. "lifetime" => 86400,
  11. "prefix" => "my-prefix"
  12. )
  13. );
  14.  
  15. // Set a custom meta-data introspection strategy
  16. $metaData->setStrategy(new MyIntrospectionStrategy());
  17.  
  18. return $metaData;
  19. };

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

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

注解策略(Annotations Strategy)

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

  1. <?php
  2.  
  3. use Phalcon\Mvc\Model;
  4.  
  5. class Robots extends Model
  6. {
  7. /**
  8. * @Primary
  9. * @Identity
  10. * @Column(type="integer", nullable=false)
  11. */
  12. public $id;
  13.  
  14. /**
  15. * @Column(type="string", length=70, nullable=false)
  16. */
  17. public $name;
  18.  
  19. /**
  20. * @Column(type="string", length=32, nullable=false)
  21. */
  22. public $type;
  23.  
  24. /**
  25. * @Column(type="integer", nullable=false)
  26. */
  27. public $year;
  28. }

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

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:

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

The annotations strategy could be set up this way:

  1. <?php
  2.  
  3. use Phalcon\Mvc\Model\MetaData\Apc as ApcMetaData;
  4. use Phalcon\Mvc\Model\MetaData\Strategy\Annotations as StrategyAnnotations;
  5.  
  6. $di['modelsMetadata'] = function () {
  7.  
  8. // Instantiate a meta-data adapter
  9. $metaData = new ApcMetaData(
  10. array(
  11. "lifetime" => 86400,
  12. "prefix" => "my-prefix"
  13. )
  14. );
  15.  
  16. // Set a custom meta-data database introspection
  17. $metaData->setStrategy(new StrategyAnnotations());
  18.  
  19. return $metaData;
  20. };

自定义元数据(Manual Meta-Data)

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

The developer also has the option of define the metadata manually. This strategy overridesany strategy set in the meta-data manager. New columns added/modified/removed to/from the mappedtable must be added/modified/removed also for everything to work properly.

The following example shows how to define the meta-data manually:

  1. <?php
  2.  
  3. use Phalcon\Mvc\Model;
  4. use Phalcon\Db\Column;
  5. use Phalcon\Mvc\Model\MetaData;
  6.  
  7. class Robots extends Model
  8. {
  9. public function metaData()
  10. {
  11. return array(
  12. // Every column in the mapped table
  13. MetaData::MODELS_ATTRIBUTES => array(
  14. 'id', 'name', 'type', 'year'
  15. ),
  16.  
  17. // Every column part of the primary key
  18. MetaData::MODELS_PRIMARY_KEY => array(
  19. 'id'
  20. ),
  21.  
  22. // Every column that isn't part of the primary key
  23. MetaData::MODELS_NON_PRIMARY_KEY => array(
  24. 'name', 'type', 'year'
  25. ),
  26.  
  27. // Every column that doesn't allows null values
  28. MetaData::MODELS_NOT_NULL => array(
  29. 'id', 'name', 'type'
  30. ),
  31.  
  32. // Every column and their data types
  33. MetaData::MODELS_DATA_TYPES => array(
  34. 'id' => Column::TYPE_INTEGER,
  35. 'name' => Column::TYPE_VARCHAR,
  36. 'type' => Column::TYPE_VARCHAR,
  37. 'year' => Column::TYPE_INTEGER
  38. ),
  39.  
  40. // The columns that have numeric data types
  41. MetaData::MODELS_DATA_TYPES_NUMERIC => array(
  42. 'id' => true,
  43. 'year' => true
  44. ),
  45.  
  46. // The identity column, use boolean false if the model doesn't have
  47. // an identity column
  48. MetaData::MODELS_IDENTITY_COLUMN => 'id',
  49.  
  50. // How every column must be bound/casted
  51. MetaData::MODELS_DATA_TYPES_BIND => array(
  52. 'id' => Column::BIND_PARAM_INT,
  53. 'name' => Column::BIND_PARAM_STR,
  54. 'type' => Column::BIND_PARAM_STR,
  55. 'year' => Column::BIND_PARAM_INT
  56. ),
  57.  
  58. // Fields that must be ignored from INSERT SQL statements
  59. MetaData::MODELS_AUTOMATIC_DEFAULT_INSERT => array(
  60. 'year' => true
  61. ),
  62.  
  63. // Fields that must be ignored from UPDATE SQL statements
  64. MetaData::MODELS_AUTOMATIC_DEFAULT_UPDATE => array(
  65. 'year' => true
  66. ),
  67.  
  68. // Default values for columns
  69. MetaData::MODELS_DEFAULT_VALUES => array(
  70. 'year' => '2015'
  71. ),
  72.  
  73. // Fields that allow empty strings
  74. MetaData::MODELS_EMPTY_STRING_VALUES => array(
  75. 'name' => true
  76. )
  77. );
  78. }
  79. }

原文: http://www.myleftstudio.com/reference/models-metadata.html