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
поэтому ваш запрос к базе данных не завершится неудачей.