2013-04-12 4 views
1

Я очень раздражен тем, что вы не справляетесь с обработкой Enel столбцов (используя Propel 1.6.9 и MySQL). Кажется, что он всегда возвращает значения по умолчанию.propel всегда выбирает значение по умолчанию для перечисляемых столбцов?

Оператор CREATE-заявление таблицы:

CREATE TABLE IF NOT EXISTS `offerVariant` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `offerID` int(11) unsigned NOT NULL, 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `description` text COLLATE utf8_unicode_ci NOT NULL, 
    [1] -> `amountType` enum('entity','person') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'entity', 
    `unitCount` smallint(5) unsigned DEFAULT NULL, 
    [2] -> `priceType` enum('per night','per day','per hour','flat rate') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'per night', 
    `tax` tinyint(3) NOT NULL DEFAULT '7', 
    `maxPrice` decimal(12,2) NOT NULL DEFAULT '0.00', 
    PRIMARY KEY (`id`), 
    KEY `offerID` (`offerID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ; 

Это соответствующая часть моего schema.xml:

<table name="offerVariant"> 
     <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/> 
     <column name="offerID" type="integer" size="11" required="true" /> 
     <column name="name" type="varchar" size="255" required="true" /> 
     <column name="description" type="longvarchar" required="true" /> 
     [1] -> <column name="amountType" type="enum" valueSet="entity, person" sqlType="ENUM('entity','person')" required="true" /> 
     <column name="unitCount" type="smallint" size="5" required="false" /> 
     [2] -> <column name="priceType" type="enum" valueSet="per night, per day, per hour, flat rate" sqlType="ENUM('per night','per day','per hour','flat rate')" required="true" /> 
     <column name="tax" type="tinyint" size="3" required="true" /> 
     <column name="maxPrice" type="decimal" size="14" required="true" /> 
     <foreign-key foreignTable="offer" refPhpName="offerVariant"> 
      <reference local="offerID" foreign="id"/> 
     </foreign-key> 
    </table> 



У меня есть 2 перечислений-столбцы, количествоType и ценаType. я выбираю 2 строки из этой таблицы

  1. один с amountType == объекта | priceType == за ночь
  2. один с amountType == человек | priceType == в день

Значение по умолчанию amountType является сущность, из priceTypeза ночь.

Принести ряды таким образом:

public function selectVariantsByOffer($offerid){ 
    $variants = OffervariantQuery::create() 
    ->filterByOfferId($offerid) 
    ->find(); 

    return $variants; 
} 

и возвращение:

[0] => Offervariant Object 
    (
    [startCopy:protected] => 
    [id:protected] => 1 
    [amounttype:protected] => 0 
    [pricetype:protected] => 0 
    [...] 
) 

[1] => Offervariant Object 
    (
    [startCopy:protected] => 
    [id:protected] => 2 
    [amounttype:protected] => 0 
    [pricetype:protected] => 0 
    [...] 
) 

после использования добытчиков:

[0] => Array 
    (
     [id] => 1 
     [...] 
     [amountType] => entity 
     [priceType] => per night 
    ) 

[1] => Array 
    (
     [id] => 2 
     [...] 
     [amountType] => entity 
     [priceType] => per night 
    ) 

просто неправильно.

Я читал о том, что Propel интерпретирует type = "enum" другим способом, чем MySQL, и что было бы необязательно установить sqlType в schema.xml. Я сделал это, как упоминалось выше, перестроен, но никаких изменений.

  1. Невозможно ли вывести указанное значение перечисления?
  2. Или мой schema.xml неверный?
  3. Или я не ошибаюсь?

ответ

5

ENUM Колонны

Хотя хранится в базе данных в виде целых чисел , ENUM столбцов позволяют пользователям управлять набором предопределенных значений, не заботясь об их хранении. http://propelorm.org

Если вы установите колонки в Propel, как ENUM объявить в SQL, как INTEGER.

Или, желательно, вы можете попробовать type="VARCHAR" sqlType="ENUM('...')".

+0

Я сделал это varchar-way и работает как шарм. Спасибо! – 32bitfloat

+0

yup, это определенно работает. Я тоже использую это решение varchar. –

+0

Просто сделал то же самое поле w/'text',' type = "VARCHAR" sqlType = "TEXT" ', поскольку я не хотел обрабатывать текстовое поле как массив в PHP. – quickshiftin