Zend Framework 2- Работа с пустыми столбцами (тип float) с пустым значением

Проблема на самом деле ошибка MySQL:

Incorrect decimal value: '' for column demand_charge at row 1

У меня есть существо, похожее на ZfcUser:

class DeviceConfiguration
{
    // ......... other properties
    /**
     * @var float
     *
     */
    private $demandCharge;

    // ......... other methods

    /**
     * Set demandCharge
     *
     * @param float $demandCharge
     * @return DeviceConfiguration
     */
    public function setDemandCharge($demandCharge)
    {
        $this->demandCharge = $demandCharge;

        return $this;
    }

    /**
     * Get demandCharge
     *
     * @return float 
     */
    public function getDemandCharge()
    {
        return $this->demandCharge;
    }
}

У меня есть картограф похож на ZfcUser с методом для вставки данных

class DeviceConfigurationMapper extends AbstractDbMapper
{
    public function insert($device, $tableName = null, HydratorInterface $hydrator = null)
    {
        $device->setLastUpdate(new DateTime());
        $result = parent::insert($device);
        $device->setId($result->getGeneratedValue());
        return $result;
    }        
}

У меня также есть класс, DeviceConfigurationHydrator который является просто продолжением Zend\Stdlib\Hydrator\ClassMethods извлекать данные из сущности или гидрировать данные для сущности!

Поле, demand_charge имеет тип float в базе данных Mysql и не является обязательным, который я определил в InputFilter. Поэтому, когда пользователь оставляет поле пустым, я получаю ошибку SQL (как указано выше).

Как мне решить эту проблему?

3 ответа

DROP TABLE IF EXISTS testfloat;
Query OK, 0 rows affected (0.11 sec)

CREATE TABLE testfloat(id int,prod_name CHAR(10), price DECIMAL);
Query OK, 0 rows affected (0.29 sec)

Вы получаете сообщение, потому что вы вставляете BLANK в DECIMAL поле. Пример ниже

INSERT INTO testfloat(id,prod_name,price) values(1,'A','');
Query OK, 1 row affected, 1 warning (0.00 sec)

show warnings;
+---------+------+---------------------------------------------------------+
| Level   | Code | Message                                                 |
+---------+------+---------------------------------------------------------+
| Warning | 1366 | Incorrect decimal value: '' for column 'price' at row 1 |
+---------+------+---------------------------------------------------------+
1 row in set (0.00 sec)

INSERT INTO testfloat(id,prod_name,price) values(1,'A','ABC');
Query OK, 1 row affected, 1 warning (0.01 sec)

show warnings;
+---------+------+------------------------------------------------------------+
| Level   | Code | Message                                                    |
+---------+------+------------------------------------------------------------+
| Warning | 1366 | Incorrect decimal value: 'ABC' for column 'price' at row 1 |
+---------+------+------------------------------------------------------------+
1 row in set (0.00 sec)

Введите правильное значение. Вы должны вставить 0,00, когда вы вставляете blank

INSERT INTO testfloat(id,prod_name,price) values(1,'A',10.00);
Query OK, 1 row affected (0.00 sec)

SELECT * FROM testfloat;
+------+-----------+-------+
| id   | prod_name | price |
+------+-----------+-------+
|    1 | A         |     0 |
|    1 | A         |     0 |
|    1 | A         |    10 |
+------+-----------+-------+
3 rows in set (0.00 sec)

Ответ, который я нашел до сих пор, довольно прост! Я добавил следующее к DeviceConfigurationHydrator увлажняющий.

class DeviceConfigurationHydrator extends ClassMethods
{
    public function extract($object)
    {

        $data = parent::extract($object);
        $field = 'demand_charge';
        if (isset($data[$field]) && empty($data[$field])) {
                unset($data[$field]);
        } 

        return $data;
    }
}

Даже уже довольно поздно - но если кто-то попадет в ту же проблему

Чтобы решить эту проблему, вы можете добавить фильтр ниже demand_charge имущество.

В Zend Framework 2: Zend_Filter_NullВ Zend Framework 3: ToNull

Внутренне каркас изменяет пустую строку '' в 0 поэтому ваш запрос к базе данных не завершится неудачей.

Другие вопросы по тегам