Использование \ Zend_Db_Table_Abstract :: find ($ id). Поле SET MySQL возвращает строку вместо (требуемого) int

Основной вопрос Как я могу извлечь столбец ‘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, но в данный момент обновление будет стоить слишком дорого.)

8

Решение

После того, как награда была начата, я заметил, что на самом деле не было простого ответа, поэтому я стал глубже изучать 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;
}

}

Итак … через некоторое время я нашел ответ, который искал, не объявляя все столбцы.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]