2010-11-06 43 views
2


我在我的應用程序中使用了Zend Framework。我想知道如何從表中的ENUM字段獲取值。例如:permissions字段(ENUM('delete_admin','edit_admin'))。如何以最佳方式獲取數組('delete_admin','edit_admin')?
預先感謝您。Zend Mysql獲取ENUM值

回答

2

這是我做的:

在模型

把這個

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; 
1

在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]); 
3

我在下一步做了:

$metadata = $this->info(self::METADATA); 
$typesString = $metadata['enum_column_name']['DATA_TYPE']; 
preg_match("=\((.*)\)=is", $typesString, $parts); 
$enumColumnValues = explode("','", trim($parts[1], "'")); 
2

這是你如何可以從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)讓您的枚舉值的數組。

請記住,您需要對information_schema-database進行讀取才能執行此操作。

0

向您的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']; 
} 
0

您的應用程序模型映射器的方法。假設your_field_name是需要列出ENUM值的數據庫列的名稱。

該方法返回一個包含your_field_name列的ENUM值的數組。

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; 
}