From 21ececd0048f7a378ebe5cc56c5bce49f5531f48 Mon Sep 17 00:00:00 2001 From: pierzakp Date: Sun, 15 Sep 2019 17:15:36 +0200 Subject: [PATCH 1/2] update save/load query building logic, check definition of columns used in conditions and prepare their values properly --- .../Sales/Model/ResourceModel/EntityAbstract.php | 6 +++++- .../Model/ResourceModel/AbstractResource.php | 11 +++++++++++ .../Framework/Model/ResourceModel/Db/AbstractDb.php | 9 +++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/Sales/Model/ResourceModel/EntityAbstract.php b/app/code/Magento/Sales/Model/ResourceModel/EntityAbstract.php index 72ce60d32877c..5abe8d67bdbff 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/EntityAbstract.php +++ b/app/code/Magento/Sales/Model/ResourceModel/EntityAbstract.php @@ -176,7 +176,11 @@ protected function _afterSave(\Magento\Framework\Model\AbstractModel $object) */ protected function updateObject(\Magento\Framework\Model\AbstractModel $object) { - $condition = $this->getConnection()->quoteInto($this->getIdFieldName() . '=?', $object->getId()); + $idFieldValue = $this->getConnection()->prepareColumnValue( + $this->_getColumnDefinition($this->getIdFieldName(), $this->getMainTable()), + $object->getId() + ); + $condition = $this->getConnection()->quoteInto($this->getIdFieldName() . '=?', $idFieldValue); $data = $this->_prepareDataForSave($object); unset($data[$this->getIdFieldName()]); $this->getConnection()->update($this->getMainTable(), $data, $condition); diff --git a/lib/internal/Magento/Framework/Model/ResourceModel/AbstractResource.php b/lib/internal/Magento/Framework/Model/ResourceModel/AbstractResource.php index 255e6d94d741f..9dcf2beab18ac 100644 --- a/lib/internal/Magento/Framework/Model/ResourceModel/AbstractResource.php +++ b/lib/internal/Magento/Framework/Model/ResourceModel/AbstractResource.php @@ -189,6 +189,17 @@ protected function _prepareDataForTable(DataObject $object, $table) return $data; } + /** + * @param string $column + * @param string $table + * @return array + */ + protected function _getColumnDefinition($column, $table) + { + $fields = $this->getConnection()->describeTable($table); + return $fields[$column] ?: null; + } + /** * Prepare value for save * diff --git a/lib/internal/Magento/Framework/Model/ResourceModel/Db/AbstractDb.php b/lib/internal/Magento/Framework/Model/ResourceModel/Db/AbstractDb.php index fc0edf931fa9c..72e713a87a2ec 100644 --- a/lib/internal/Magento/Framework/Model/ResourceModel/Db/AbstractDb.php +++ b/lib/internal/Magento/Framework/Model/ResourceModel/Db/AbstractDb.php @@ -358,7 +358,7 @@ public function load(\Magento\Framework\Model\AbstractModel $object, $value, $fi $object->afterLoad(); $object->setOrigData(); $object->setHasDataChanges(false); - + return $this; } @@ -373,6 +373,7 @@ public function load(\Magento\Framework\Model\AbstractModel $object, $value, $fi */ protected function _getLoadSelect($field, $value, $object) { + $value = $this->getConnection()->prepareColumnValue($this->_getColumnDefinition($field, $this->getMainTable()), $value); $field = $this->getConnection()->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), $field)); $select = $this->getConnection()->select()->from($this->getMainTable())->where($field . '=?', $value); return $select; @@ -793,7 +794,11 @@ protected function saveNewObject(\Magento\Framework\Model\AbstractModel $object) */ protected function updateObject(\Magento\Framework\Model\AbstractModel $object) { - $condition = $this->getConnection()->quoteInto($this->getIdFieldName() . '=?', $object->getId()); + $idFieldValue = $this->getConnection()->prepareColumnValue( + $this->_getColumnDefinition($this->getIdFieldName(), $this->getMainTable()), + $object->getId() + ); + $condition = $this->getConnection()->quoteInto($this->getIdFieldName() . '=?', $idFieldValue); /** * Not auto increment primary key support */ From 6c9748c9bebd0dd45df02a25669c4f2dbaca05a8 Mon Sep 17 00:00:00 2001 From: pierzakp Date: Sun, 15 Sep 2019 17:33:22 +0200 Subject: [PATCH 2/2] cast result to array, reformat --- .../Magento/Sales/Model/ResourceModel/EntityAbstract.php | 2 +- .../Framework/Model/ResourceModel/Db/AbstractDb.php | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/Sales/Model/ResourceModel/EntityAbstract.php b/app/code/Magento/Sales/Model/ResourceModel/EntityAbstract.php index 5abe8d67bdbff..e06d0dd61b975 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/EntityAbstract.php +++ b/app/code/Magento/Sales/Model/ResourceModel/EntityAbstract.php @@ -177,7 +177,7 @@ protected function _afterSave(\Magento\Framework\Model\AbstractModel $object) protected function updateObject(\Magento\Framework\Model\AbstractModel $object) { $idFieldValue = $this->getConnection()->prepareColumnValue( - $this->_getColumnDefinition($this->getIdFieldName(), $this->getMainTable()), + (array)$this->_getColumnDefinition($this->getIdFieldName(), $this->getMainTable()), $object->getId() ); $condition = $this->getConnection()->quoteInto($this->getIdFieldName() . '=?', $idFieldValue); diff --git a/lib/internal/Magento/Framework/Model/ResourceModel/Db/AbstractDb.php b/lib/internal/Magento/Framework/Model/ResourceModel/Db/AbstractDb.php index 72e713a87a2ec..8d807721fa1dd 100644 --- a/lib/internal/Magento/Framework/Model/ResourceModel/Db/AbstractDb.php +++ b/lib/internal/Magento/Framework/Model/ResourceModel/Db/AbstractDb.php @@ -373,7 +373,10 @@ public function load(\Magento\Framework\Model\AbstractModel $object, $value, $fi */ protected function _getLoadSelect($field, $value, $object) { - $value = $this->getConnection()->prepareColumnValue($this->_getColumnDefinition($field, $this->getMainTable()), $value); + $value = $this->getConnection()->prepareColumnValue( + (array)$this->_getColumnDefinition($field, $this->getMainTable()), + $value + ); $field = $this->getConnection()->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), $field)); $select = $this->getConnection()->select()->from($this->getMainTable())->where($field . '=?', $value); return $select; @@ -795,7 +798,7 @@ protected function saveNewObject(\Magento\Framework\Model\AbstractModel $object) protected function updateObject(\Magento\Framework\Model\AbstractModel $object) { $idFieldValue = $this->getConnection()->prepareColumnValue( - $this->_getColumnDefinition($this->getIdFieldName(), $this->getMainTable()), + (array)$this->_getColumnDefinition($this->getIdFieldName(), $this->getMainTable()), $object->getId() ); $condition = $this->getConnection()->quoteInto($this->getIdFieldName() . '=?', $idFieldValue);