Основной вопрос Как я могу извлечь столбец ‘type’ как целочисленное значение из средства отображения таблиц?
У меня есть приложение PHP Zend Framework 1.12, работающее на веб-сайте. Внутри MySQL находятся несколько таблиц с несколькими столбцами.
Внутри двух таблиц я использую тип SET. Столбец называется «тип» и как «набор (« МЕСТНЫЙ »,« ВНЕШНИЙ »). Не путайте этот тип поля с ENUM, пожалуйста!
Пока проблем нет, запрос к таблице и выборка столбца типа INT или STRING не являются проблемой:
$Sql = $Db->select()->from('tablename', ['type_as_int' => new \Zend_Db_Expr('type+0')]); //returns INT (if both are selected: 3)
$Sql = $Db->select()->from('tablename', ['type']); //returns STRING (if both are selected: LOCAL,EXTERNAL)
Но в этом приложении также есть средства отображения таблиц, расширяющие Zend_Db_Table_Abstract.
Внутри картографа находится метод find (). По умолчанию встроен в реферат для поиска записей по их первичному ключу.
Но .. Когда я использую объект для извлечения записи, я нахожу следующий ответ внутри моего метода заполнения:
array([type] => LOCAL,EXTERNAL)
Запрашивать его вручную (и определять столбцы самостоятельно) было бы вариантом ($ this-> select () -> from …), но разве нет более элегантного способа?
(Я знаю, что использую старую версию ZF, но в данный момент обновление будет стоить слишком дорого.)
После того, как награда была начата, я заметил, что на самом деле не было простого ответа, поэтому я стал глубже изучать Zend Framework 1.12 и объекты mapper, которые я использую.
Я заметил, что метод find () просто использует столбцы первичного ключа для построения запроса.
Поэтому, начав с этих знаний, я создал свой собственный метод find (), который находится в «mapper абстрактной модели» и использует маппер find () внутри класса, расширяющего \ Zend_Db_Table_Abstract
/* sample abstract mapper class with find */
abstract class MapperAbstract {
/*
* Zend db table abstract object
* @var \Zend_Db_Table_Abstract
*/
private $DbTable;
public function find($id, $Model) {
$Select = $this->$DbTable->select(\Zend_Db_Table_Abstract::SELECT_WITH_FROM_PART);
//Fetch record and populate model if we got
//a result
$Row = $this->$DbTable->fetchRow($Select);
//do some extra shizzle
if ($Row !== null) {
return $Model->populate((array)$Row);
}
return;
}
}
Теперь мне нужно добавить метод, который переопределяет столбцы по умолчанию.
Поэтому я создал метод с именем ‘overrideColumns ()’, который возвращает массив, заполненный именами столбцов, которые должны быть выбраны или должны быть переопределены.
/**
* Returns array with columns that need to be overridden
* or selected as extra
* @return array
*/
public function overrideColumns() {
return ['type' => new \Zend_Db_Expr('type+0')];
}
И с этого момента мне нужно было только настроить запрос $ Select, чтобы он использовал метод overrideColumns ().
Таким образом, полный класс становится примерно таким:
/* sample abstract mapper class with find */
abstract class MapperAbstract {
/*
* Zend db table abstract object
* @var \Zend_Db_Table_Abstract
*/
private $DbTable;
/**
* Returns array with columns that need to be overridden
* or selected as extra
* @return array
*/
private function overrideColumns() {
return ['type' => new \Zend_Db_Expr('type+0')];
}
public function find($id, $Model) {
$Select = $this->DbTable->select(\Zend_Db_Table_Abstract::SELECT_WITH_FROM_PART);
//Check if we need to override columns in the select query
$overrideColumns = $this->getOverrideColumns();
if (!empty($overrideColumns)) {
$Select->columns($overrideColumns); //overrides the columns
}
//Add where clause to the query
//I know there can also be a compound primary key, but
//I'm just ignoring that in this example
$Select->where($this->DbTable->getPrimaryKeyColumn() . ' = ?', $id);
//doing some extra shizzle
//that is not important when I want to explain stuff
//Fetch record and populate model if we got a result
$Row = $this->DbTable->fetchRow($Select);
if ($Row !== null) {
return $Model->populate((array)$Row);
}
return;
}
}
Итак … через некоторое время я нашел ответ, который искал, не объявляя все столбцы.
Других решений пока нет …