1

Zend Framework 1.12.1 で作業しています

Zend_Db_Table_Abstract の行で「保存」メソッドを使用しようとしています。私が理解しているように、このメソッドは、テーブル内の行を保存するか更新するかを自動的に決定する必要があります。データベースにレコードを作成するためのフォームと、更新するためのフォームの 2 つを作成しました。新しいレコードを作成するのに最適です。メソッドは INSERT MySQL コマンドを使用します。行を更新しようとしているときに、MySQL コマンドの UPDATE を選択する代わりに、save() メソッドは引き続き INSERT を選択し、テーブル内のレコードを複製します。

完全なエラー ログは次のとおりです。

Message: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'France' for key 'country'

Stack trace:

#0 C:\wamp\zf\library\Zend\Db\Statement.php(303): Zend_Db_Statement_Pdo->_execute(Array)
#1 C:\wamp\zf\library\Zend\Db\Adapter\Abstract.php(480): Zend_Db_Statement->execute(Array)
#2 C:\wamp\zf\library\Zend\Db\Adapter\Pdo\Abstract.php(238): Zend_Db_Adapter_Abstract->query('INSERT INTO `co...', Array)
#3 C:\wamp\zf\library\Zend\Db\Adapter\Abstract.php(576): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `co...', Array)
#4 C:\wamp\zf\library\Zend\Db\Table\Abstract.php(1076): Zend_Db_Adapter_Abstract->insert('countries', Array)
#5 C:\wamp\zf\library\Zend\Db\Table\Row\Abstract.php(467): Zend_Db_Table_Abstract->insert(Array)
#6 C:\wamp\zf\library\Zend\Db\Table\Row\Abstract.php(438): Zend_Db_Table_Row_Abstract->_doInsert()
#7 C:\wamp\www\website\library\App\Data.php(34): Zend_Db_Table_Row_Abstract->save()
#8 C:\wamp\www\website\application\controllers\CountryController.php(82): App_Data->save()
#9 C:\wamp\zf\library\Zend\Controller\Action.php(516): CountryController->editAction()
#10 C:\wamp\zf\library\Zend\Controller\Dispatcher\Standard.php(308): Zend_Controller_Action->dispatch('editAction')
#11 C:\wamp\zf\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#12 C:\wamp\zf\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch()
#13 C:\wamp\zf\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#14 C:\wamp\www\website\public\index.php(26): Zend_Application->run()
#15 {main}  

テーブルのレコードを更新しようとしています {'id'=>'1', 'country'=>'France', 'continent'=>'Europe', 'created'=>'2013-03-07 10 :10', '変更'=>''}

メソッド save() に強制的に _doInsert() の代わりに Zend_Db_Table_Row_Abstract->_doUpdate() メソッドを選択させる方法はありますか?

どうもありがとう。

4

1 に答える 1

0

現時点ではすべて推測しているため、質問を更新してコードを追加する必要がある場合があります。

これは、配列の代わりにエンティティ モデルを使用して、マッパーで save() がどのように機能するかの簡単な例です。

public function saveArtist(Music_Model_Artist $artist)
    {
        //if id is set fetch the row
        if (!is_null($artist->id)) {
            $select = $this->getGateway()->select();
            $select->where('id = ?', $artist->id);
            $row = $this->getGateway()->fetchRow($select);
        } else {
            //if id is not set create a new row
            $row = $this->getGateway()->createRow();
        }
        // this data is added to the record always
        $row->name = $artist->name;
        //save/update the row
        $row->save();
        //return the whole row, my preference as save() just returns primary key of row.
        return $row;
    }

実際に何が起こるかというと、既存の行を送信するsave()UPDATEになり、新しい行を作成するsave()INSERTになります。このメソッドには、渡されたデータに基づいて何を行うかを制御する魔法はありません。具体的で、うまく機能します。

UPDATEを実行しようとしているときに、アプリがINSERTを実行しているように見えます。

于 2013-03-08T11:05:51.003 に答える