0

Zend Framework で Docrine 1.2 を使用しており、Doctrine コレクションを保存しようとしています。

次のコードを使用して、テーブル クラスからコレクションを取得しています。

public function getAll()
{
   return $this->createQuery('e')
    ->orderBy('e.order ASC, e.eventType ASC')
    ->execute();
}

上記のイベント レコードを並べ替える次のクラスもあります。

class Admin_Model_Event_Sort extends Model_Abstract
{
    /**
     * Events collection
     * @var Doctrine_Collection
     */
    protected $_collection = null;

    public function __construct()
    {
        $this->_collection = Model_Doctrine_EventTypesTable::getInstance()->getAll();
    }

    public function save($eventIds)
    {
        if ($this->_collection instanceof Doctrine_Collection) {
            foreach ($this->_collection as $record)
            {
                $key = array_search($record->eventTypeId, $eventIds);
                if ($key !== false) {
                    $record->order = (string)$key;
                }
            }
            return $this->_saveCollection($this->_collection);
        } else {
            return false;
        }
    }

}

上記の _saveCollection メソッドは次のとおりです。

/**
 * Attempts to save a Doctrine Collection
 * Sets the error message property on error
 * @param Doctrine_Collection $collection
 * @return boolean
 */
protected function _saveCollection(Doctrine_Collection $collection)
{
    try {
        $collection->save();
        return true;
    } catch (Exception $e) {
        $this->_errorMessage = $e->getMessage();
        OpenMeetings_Logger_ErrorLogger::write('Unable to save Doctrine Collection');
        OpenMeetings_Logger_ErrorLogger::vardump($this->_errorMessage);
        return false;
    }
}

上記の save メソッドのイベント ID は、単純にイベント ID の列挙型配列です。配列のキーを使用して、順序フィールドを使用してイベントの並べ替え順序を設定しています。コレクションの var_dump を配列 ($this->_collection->toArray()) に実行すると、正しいデータが得られます。ただし、コレクションを保存しようとすると、次のエラーが発生します。

"SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1064 SQL 構文にエラーがあります。使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。'order = '0' WHERE eventtypeid = '3 '' 行 1 で"

Doctrine にこのエラーを拡張させる方法はありますか?完全な SQL ステートメントが最初になります。

よろしくお願いします

ギャリー

編集

一度に 1 つのレコードを処理するように上記のコードを変更しましたが、それでも同じ問題が発生します。

public function save($eventIds)
    {
        foreach ($eventIds as $key => $eventId) {
            $event = Model_Doctrine_EventTypesTable::getInstance()->getOne($eventId);
            $event->order = (string)$key;
            $event->save();
        }

    }
4

1 に答える 1

1

わかりました、問題を見つけました。MYSQLの予約語順をフィールド名として使用していたため、エラーが発生し、sortOrderに変更され、問題は解決しました。

これが同様の問題を抱えている人に役立つことを願っています。

ギャリー

于 2012-08-07T19:18:20.260 に答える