Magento模型 - > save()不起作用

时间:2012-10-15 04:46:50

标签: magento

你好我的模型save()函数不起作用。 Magento缓存已关闭。我的代码如下:

$newInventory = Mage::getModel('reservation/newinventory');
Mage::log( get_class( $newInventory ) ); //print Apptha_Reservation_Model_Newinventory

$newInventory->setEntityId( $productId ); 
$newInventory->setRoomTypeId( $roomTypeId );
$newInventory->setRoomsCount( $roomsCount );
$newInventory->setDateFrom( $checkInStamp );
$newInventory->setDateTo( $checkOutStamp );
$newInventory->setOrderId( $orderId );

$query = $newInventory->save();

Mage::log( "save query below: " ); //I get this string
Mage::log( $query->toString() ); //return 2012-10-15T06:00:58+00:00 DEBUG (7): 17, 7, 8,
                                //1349913600, 1349913600, 300000040, 12

这是我的代码\ local \ Apptha \ Reservation \ etc \ config.xml

 <models>
        <reservation>
            <class>Apptha_Reservation_Model</class>
            <resourceModel>reservation_mysql4</resourceModel>
        </reservation>
        <reservation_mysql4>
            <class>Apptha_Reservation_Model_Mysql4</class>
            <entities>
               <newinventory>
        <table>apptha_booking_hotel_newinventory</table>
       </newinventory>
            </entities>
        </reservation_mysql4> 
</models> 
    <resources>
        <reservation_setup>
            <setup>
                <module>Apptha_Reservation</module>
                <class>Mage_Catalog_Model_Resource_Eav_Mysql4_Setup</class>
            </setup>
            <connection>
                <use>core_setup</use>
            </connection>
        </reservation_setup>
        <reservation_write>
            <connection>
                <use>core_write</use>
            </connection>
        </reservation_write>
        <reservation_read>
            <connection>
                <use>core_read</use>
            </connection>
        </reservation_read>
    </resources>

我做错了什么?为什么新行没有出现在db?

更新1

在我的index.php中我有

error_reporting(E_ALL ^ E_NOTICE);

//if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) {
Mage::setIsDeveloperMode(true);
ini_set("display_errors", 1);
//}

更新2

我的代码\ local \ Apptha \ Reservation \ Model \ newinventory.php

class Apptha_Reservation_Model_Newinventory extends Mage_Core_Model_Abstract{

protected function _construct(){
    $this->_init('reservation/newinventory');
}
}

我的代码\ local \ Apptha \ Reservation \ Model \ Mysql4 \ newinventory.php

 class Apptha_Reservation_Model_Mysql4_Newinventory extends Mage_Core_Model_Mysql4_Abstract{

protected function _construct(){
    $this->_init('reservation/newinventory', 'id');
}

}

所以我没有从Magento那里得到任何错误。看起来Magento找到了所有的模型(模型,资源等)但无论如何都不能保存()我的数据。

更新3 我插入代码将Mysql.php中的查询记录到公共函数查询($ sql,$ bind = array())

    $code = 'SQL: ' . $sql . "\r\n";
if ($bind) {
    $code .= 'BIND: ' . print_r($bind, true) . "\r\n";
}
Mage::Log("[".date('Y-m-d H:i:s')."] ".$code);

然后我进入日志文件:

2012-10-15T09:54:31+00:00 DEBUG (7): [2012-10-15 09:54:31] SQL: INSERT INTO 
`apptha_booking_hotel_newinventory` (`entity_id`, `room_type_id`, `rooms_count`, `date_from`,
`date_to`, `order_id`) VALUES (?, ?, ?, ?, ?, ?)
BIND: Array
(
[0] => 17
[1] => 7
[2] => 8
[3] => 1349913600
[4] => 1349913600
[5] => 300000040
)

我尝试在phpmyadmin中手动执行此查询,它工作正常。但是Magento无法做到。

更新4

好。在我讨论这个问题时,我在控制器中编写了额外的testModel动作,试图测试save()函数。我看到了,它在那里工作。

然后我回到原来的函数并发现当我在if-block之外创建save()然后save()工作正常。如果我在if-block中创建save(),那么它就不起作用了。

我在if-block中记录了一些字符串并确保执行进入if-block。所以实际上问为什么save()不能在if-block下面工作:

    if ( $state == "complete" ){
    Mage::log('here');
        $newInventory = Mage::getModel('reservation/newinventory');
        $newInventory->setEntityId(12);
        $newInventory->setRoomTypeId(7);
        $newInventory->setRoomsCount(8);
        $newInventory->setDateFrom(1349913600);
        $newInventory->setDateTo(1349913600);
        $newInventory->setOrderId(300000040);

        $query = $newInventory->save();
    die;
   } 

但如果条件是

if ( $state === "processing" )

然后它工作正常。订单状态更改时,此代码处于观察者功能中。当管理员制作&#34; invoice&#34;对于产品,产品状态从&#34;处理&#34;到&#34;完成&#34;。之前Magento进入了两次这个功能。第一次进行&#34;处理&#34; save()工作正常,但在&#34;完成&#34;它没有用。

3 个答案:

答案 0 :(得分:3)

问题在于一些内部Magento处理。我花了一天的时间来理解它。

但现在停止并使用另一个观察者事件sales_order_save_commit_after解决它,我检查订单状态已完成并使用save()函数。确定在这里工作正常。

答案 1 :(得分:1)

我有一些严重怀疑 $ newInventory 包含您的模型。您在config.xml中声明实体 hotel_newinventory ,但尝试加载实体 newinventory 。你可以这样检查:

Mage::log(get_class($newInventory));

如果我是对的并且结果不是您的模型类,请尝试更改以下行

return Mage::getModel('reservation/newinventory');

return Mage::getModel('reservation/hotel_newinventory');

答案 2 :(得分:0)

您还可以使用“sales_order_place_after”(不需要使用“sales_order_save_commit_after”)事件来保留模型。

您无法停止执行,因为sql事务未在“sales_order_place_after”中完成,所以不会直接写入任何内容,但稍后会将事务提交到数据库。

希望这有助于某人。