Метаданные моделей
Для ускорения разработки Phalcon\Mvc\Model помогает вам получать поля и ограничения из таблиц, связанных с моделями. Для этого доступен Phalcon\Mvc\Model\MetaData для управления и кеширования метаданных таблиц.
Иногда необходимо получить эти атрибуты при работе с моделями. Вы можете получить экземпляр метаданных следующим образом:
$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 |
|---|---|---|
| Память | Этот адаптер является стандартным. Метаданные кэшируются только во время запроса. По завершении запроса метаданные освобождаются как часть обычной памяти запроса. Этот адаптер идеально подходит для разработки, так как метаданные обновляются в каждом запросе, содержащем новые и/или измененные поля. | Phalcon\Mvc\Model\MetaData\Memory |
| Сессия | Этот адаптер хранит метаданные в $_SESSION суперглобальной переменной. Этот адаптер рекомендуется только в том случае, если приложение действительно использует небольшое количество моделей. Метаданные обновляются каждый раз при начале новой сессии. Это также требует использования session_start() для запуска сессии перед использованием каких-либо моделей. | Phalcon\Mvc\Model\MetaData\Session |
| Apc | Этот адаптер использует кэш альтернативного PHP (APC) для хранения метаданных таблицы. Вы можете указать время жизни метаданных с помощью параметров. Это наиболее рекомендуемый способ хранения метаданных, когда приложение находится в стадии производства. | Phalcon\Mvc\Model\MetaData\Apc |
| XCache | Этот адаптер использует XCache для хранения метаданных таблицы. Вы можете указать время жизни метаданных с помощью параметров. Это наиболее рекомендуемый способ хранения метаданных, когда приложение находится в стадии производства. | Phalcon\Mvc\Model\MetaData\Xcache |
| Файлы | Этот адаптер использует обычные файлы для хранения метаданных. При использовании этого адаптера увеличивается чтение с диска, но уменьшается доступ к базе данных. | Phalcon\Mvc\Model\MetaData\Files |
Как и другие зависимости ORM, менеджер метаданных запрашивается из контейнера сервисов:
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;
};
Стратегии метаданных
Как упоминалось выше, по умолчанию для получения метаданных модели используется интроспекция базы данных. В этой стратегии используется информация схемы, чтобы узнать поля в таблице, первичный ключ, поля с возможностью NULL, типы данных и т. д.
Вы можете изменить стандартную интроспекцию метаданных следующим образом:
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;
};
Стратегия интроспекции базы данных
Эта стратегия не требует настройки и неявно используется всеми адаптерами метаданных.
Стратегия аннотаций
Эта стратегия использует аннотации для описания столбцов в модели:
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 | Поле является столбцом с автоинкрементом/последовательностью |
| Column | Это отмечает атрибут как сопоставленный столбец |
Аннотация @Column поддерживает следующие параметры:
| Имя | Описание |
|---|---|
| type | Тип столбца (строка, целое число, десятичное число, булево) |
| length | Длина столбца, если есть |
| nullable | Установить, принимает ли столбец значения NULL или нет |
Стратегия аннотаций может быть настроена следующим образом:
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 может автоматически получать метаданные для каждой модели, без необходимости разработчику устанавливать их вручную, используя любую из представленных выше стратегий интроспекции.
Разработчик также имеет возможность вручную определить метаданные. Эта стратегия переопределяет любую установленную в менеджере метаданных стратегию. Новые столбцы, добавленные/измененные/удаленные в/из сопоставленной таблицы, также должны быть добавлены/изменены/удалены для правильной работы.
Следующий пример демонстрирует, как определить метаданные вручную:
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,
],
);
}
}
© 2011–2017 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/latest/reference/models-metadata.html