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();
}
}