內容目录上一个主题下一个主题本页 |
模型元数据(Models Meta-Data)¶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 meta-data. Sometimes it is necessary to get those attributes when working with models. You can get a meta-data 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 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 each time you use the table. This could be done caching the meta-data using any of the following adapters:
As other ORM’s dependencies, the metadata manager is requested from the services container: <?php
use Phalcon\Mvc\Model\MetaData\Apc as ApcMetaData;
$di['modelsMetadata'] = function () {
// Create a meta-data manager with APC
$metaData = new ApcMetaData(
array(
"lifetime" => 86400,
"prefix" => "my-prefix"
)
);
return $metaData;
};
元数据策略(Meta-Data Strategies)¶As mentioned above the default strategy to obtain the model’s meta-data 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 meta-data introspection in the following way: <?php
use Phalcon\Mvc\Model\MetaData\Apc as ApcMetaData;
$di['modelsMetadata'] = function () {
// Instantiate a meta-data adapter
$metaData = new ApcMetaData(
array(
"lifetime" => 86400,
"prefix" => "my-prefix"
)
);
// Set a custom meta-data 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 meta-data 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. The following annotations are supported:
The annotation @Column supports the following parameters:
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 meta-data adapter
$metaData = new ApcMetaData(
array(
"lifetime" => 86400,
"prefix" => "my-prefix"
)
);
// Set a custom meta-data database introspection
$metaData->setStrategy(new StrategyAnnotations());
return $metaData;
};
自定义元数据(Manual Meta-Data)¶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 meta-data 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 meta-data 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 => array(
'id', 'name', 'type', 'year'
),
// Every column part of the primary key
MetaData::MODELS_PRIMARY_KEY => array(
'id'
),
// Every column that isn't part of the primary key
MetaData::MODELS_NON_PRIMARY_KEY => array(
'name', 'type', 'year'
),
// Every column that doesn't allows null values
MetaData::MODELS_NOT_NULL => array(
'id', 'name', 'type'
),
// Every column and their data types
MetaData::MODELS_DATA_TYPES => array(
'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 => array(
'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 => array(
'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 => array(
'year' => true
),
// Fields that must be ignored from UPDATE SQL statements
MetaData::MODELS_AUTOMATIC_DEFAULT_UPDATE => array(
'year' => true
),
// Default values for columns
MetaData::MODELS_DEFAULT_VALUES => array(
'year' => '2015'
),
// Fields that allow empty strings
MetaData::MODELS_EMPTY_STRING_VALUES => array(
'name' => true
)
);
}
}
|