Я использую Zend Framework
в своем приложении. И я хочу знать, как получить значения из поля ENUM в таблице MySQL
.
Например: у меня есть поле permissions
( ENUM
('delete_admin', 'edit_admin')). Как получить массив ('delete_admin', 'edit_admin') наилучшим образом?
Заранее спасибо.
Вот как я это сделал:
в вашей модели положите это
function getInfoTabella() { $data = $this->info(self::METADATA); return $data; }
затем используйте это:
$model = new $model_name(); $description = $model->getInfoTabella(); $enum = $description[$FIELD_NAME]['DATA_TYPE']; $inizia_enum = strpos($enum, "'"); $finisce_enum = strrpos($enum, "'"); if ($inizia_enum === false || $finisce_enum === false) throw new Exception('errore enum database'); $finisce_enum -= $inizia_enum ; $enum = substr($enum, $inizia_enum, $finisce_enum+1); str_replace("'", '', $enum); $enum = explode("," , $enum); return $enum;
Я сделал это следующим образом:
$metadata = $this->info(self::METADATA); $typesString = $metadata['enum_column_name']['DATA_TYPE']; preg_match("=\((.*)\)=is", $typesString, $parts); $enumColumnValues = explode("','", trim($parts[1], "'"));
Вот как вы можете получить строку, готовую к взрыву, из MySQL:
SELECT REPLACE(TRIM(TRAILING ')' FROM (TRIM(LEADING 'enum(' FROM c.COLUMN_TYPE))), '\'', '') FROM information_schema.`COLUMNS` c WHERE c.COLUMN_NAME = 'enum_col'
Вам просто нужно сделать explode(',' $result)
на нем, чтобы получить массив с вашими значениями enum.
Помните, что для этого вам нужен доступ для чтения к базе данных information_schema.
Добавьте это в свой класс Zend_Table:
$adapter = $this->getDefaultAdapter(); $sql = 'SHOW COLUMNS FROM `table` LIKE `field`'; $result = $adapter->fetchRow($sql); preg_match('=\((.*)\)=is' $options); str_replace("'", '' $options[1]); $options = explode(',', $options[1]);
Добавьте метод в расширенный класс Zend_Db_Table_Abstract.
public function getEnumValues($field) { $metadata = $this->info(self::METADATA); preg_match_all('/\'(?<item>.+?)\'/', $metadata[$field]['DATA_TYPE'], $matches); return $matches['item']; }
Метод для вашей модели модели приложения. Предполагая, что your_field_name – это имя столбца базы данных, для которого необходимо указать значения ENUM.
Метод возвращает массив с значениями ENUM столбца your_field_name.
public function getAvailableEnumTypes() { $this->your_model_name = new Application_Model_DbTable_YourModelName(); // DB table $info = $this->your_model_name->info(); $dat = explode("','", preg_replace("/(enum\('|'\))/", "", $info['metadata']['your_field_name']['DATA_TYPE'])); return $dat; }