0

我正在使用带有 Zend 框架的 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;
    }
}

上述保存方法中的事件 id 只是一个事件 id 的枚举数组,我使用数组的键来使用 order 字段设置事件的排序顺序。如果我将集合的 var_dump 到数组 ($this->_collection->toArray()) 我得到正确的数据。但是,当我尝试保存集合时,出现以下错误。

“SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,了解在 'order = '0' WHERE eventtypeid = '3 附近使用的正确语法''在第 1 行"

无论如何我可以让 Doctrine 扩展这个错误,完整的 SQL 语句将是一个开始,如果有人知道为什么会发生这个错误,那将非常有帮助。

提前谢谢了

加里

编辑

我已经修改了上面的代码以尝试一次处理一条记录,但我仍然遇到同样的问题。

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 保留字 order 作为字段名,因此出现错误,将其更改为 sortOrder,问题就消失了。

希望这可以帮助有类似问题的人。

加里

于 2012-08-07T19:18:20.260 回答