Magento 自定义模块中的完整性约束违规

Posted

技术标签:

【中文标题】Magento 自定义模块中的完整性约束违规【英文标题】:Integrity constraint violation in Magento custom module 【发布时间】:2012-12-16 07:01:39 【问题描述】:

我有一个与 Integrity constraint violation creating Product in Magento 类似的问题(未回答),但我正在创建一个自定义的观察者,它挂接到 catalog_product_save_after 事件 - 基于本教程:http://fishpig.co.uk/blog/custom-tabs-magento-product-admin.html

但是,每当保存新产品时,我都会收到此错误:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '22-1' for key 'UNQ_CATALOGINVENTORY_STOCK_ITEM_PRODUCT_ID_STOCK_ID'

config.xml 如下所示:

<adminhtml>
    <events>
        <catalog_product_save_after>
            <observers>
                <a1web_save_product_data>
                    <type>singleton</type>
                    <class>metricimperial/observer</class>
                    <method>saveProductData</method>
                </a1web_save_product_data>
            </observers>
        </catalog_product_save_after>
    </events>
</adminhtml>

类的大纲是这样的:

<?php

class A1web_MetricImperialConverter_Model_Observer

    /**
     * Flag to stop observer executing more than once
     *
     * @var static bool
     */
    static protected $_singletonFlag = false;

     * @param Varien_Event_Observer $observer
     */
    public function saveProductData(Varien_Event_Observer $observer)
    
        if (!self::$_singletonFlag) 
               self::$_singletonFlag = true;

                $product = $observer->getEvent()->getProduct();

                //Custom updates made to product object here

                $product->save();
            
            catch (Exception $e) 
                Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
            
        
    

    /**
     * Retrieve the product model
     *
     * @return Mage_Catalog_Model_Product $product
     */
    public function getProduct()
    
        return Mage::registry('product');
    

    /**
     * Shortcut to getRequest
     *
     */
    protected function _getRequest()
    
        return Mage::app()->getRequest();
    

使用我正在添加的自定义产品数据正确保存了产品 - 一旦保存了产品,该错误就不会在随后保存相同产品时发生。只是在首次创建产品时发生错误。

提前致谢

【问题讨论】:

在...产品保存期间调用产品保存有点奇怪。你的观察者具体做什么?模块名称只是部分揭示了它的功能。使用属性后端模型可能会/更好地完成您尝试完成的工作。 基本上是@benmarks 所说的。进行更改,但不要调用 save,magento 会为您完成。您可能想澄清一下您要做什么。 @DanielSloof 他必须保存,这是在事件后观察保存。 @benmarks:我并没有真正注意到它,但那是我要表达的观点的一部分……为什么它不是事件前保存的一部分?我们需要更多信息:) 大家好 - 感谢您的反馈。我正在根据管理员提供的标准“重量”(十进制数)属性和第二个“weight_display_option”(下拉)属性进行大量计算,以允许加载不同类型的质量/重量组合根据产品的种类,保存到第三个“weight_display”(字符串)(带有适当的舍入和单位)。长度也是类似的。 【参考方案1】:

在这种情况下,我建议不要使用catalog_product_save_after 事件。相反,请尝试使用catalog_product_prepare_save,它在 POST 数据应用于产品之后触发,但-&gt;save() 被调用。这样你就不必纠结于保存或丑陋的$_singletonFlag

此外,使用catalog_product_prepare_save,您可以在观察者事件中获得 HTTP 请求 对象。不需要Mage::app()-&gt;getRequest()。哇!

【讨论】:

【参考方案2】:

不要使用$product-&gt;save(),而是尝试使用资源模型,比如$product-&gt;getResource()-&gt;save($product)

$product-&gt;save() 的原因将重新触发所有保存事件,因此运行保存 cataloginventory_stock 的任何内容并引发错误。

【讨论】:

做到了!非常感谢富兰克林。 救命稻草回答我!

以上是关于Magento 自定义模块中的完整性约束违规的主要内容,如果未能解决你的问题,请参考以下文章

Innobyte 插件问题:SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行

SQLSTATE[23000]:Laravel 中的完整性约束违规

:完整性约束违规:1452 无法添加或更新子行:laravel 迁移中的外键约束失败

完整性约束违规:字段列表中的 1052 列“updated_at”不明确

完整性约束违规:19 NOT NULL 约束因迁移表中没有的内容而失败

SQLSTATE [23000]:完整性约束违规:1048 laravel 5.7