💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[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, ], ); } } ```