我可以获得可版本化Doctrine记录的版本集合吗?

时间:2010-03-22 20:19:47

标签: php doctrine

所以我试图找到一种方法来获取可版本化Doctrine Record的所有版本的集合。这可能吗?我绝对可以构建一些可以做到的东西,但我不确定功能是否已经内置。 提前致谢, 约翰

4 个答案:

答案 0 :(得分:3)

我很确定Doctrine的(至少1.2版本)版本化行为没有为您的模型定义任何其他方法,除了revert()允许您恢复以前版本的资源。

所以你必须自己做所有事情。

答案 1 :(得分:1)

您可以在Version表上查询: 教义:: getTable( 'EntityVersions') - > findAllById($ ENTITY_ID);

gyaan :对于任何版本表,PK都共同放在id&版。与默认的学说风格不同,没有代理键!

答案 2 :(得分:1)

我在相应的Table-Class 中实现了一个访问快捷方式,例如model/doctrine/ItemTable.class.php

public static function getHistoryInstance() {
    return self::getInstance()->getTemplate('Versionable')->getAuditLog()->getTable();
}

然后从以下方式访问这样的历史记录:

    $history_collection = ItemTable::getHistoryInstance()->createQuery()
            ->select('id')
            ->execute();

(我正在使用Symfony 1.4和Doctrine 1.2)

答案 3 :(得分:0)

以防万一其他人偶然发现:以下是如何获取版本化记录的快速解决方案。 (这当然应该更好地在'AuditLog'类的内部或扩展中实现,但是为了快速解决方案,以下内容可以随处去。)

/**
 * get collection of versioned records as array
 * 
 * @param string $table table name without the 'Version' -suffix (e.g. 'User' instead of 'UserVersion')
 * @param mixed $id simple id or array with key / value pairs for compound keys
 * @return array 
 */
public function getHistory($table, $ids) {

    $className = $table . 'Version';

    $identifiers = (array) Doctrine_Core::getTable($table)->getIdentifier();
    if (count($identifiers) === 1) {
        $ids = array_combine($identifiers, (array) $ids);
    }

    $q = Doctrine_Core::getTable($className)
            ->createQuery();

    $conditions = array();
    $values = array();
    foreach ($identifiers as $id) {
        if (!isset($ids[$id])) {
            throw new Doctrine_Record_Exception('Primary key \'' . $id . '\' must be given to access ' . $className . '.');
        }
        $conditions[] = $className . '.' . $id . ' = ?';
        $values[] = $ids[$id];
    }

    $q->where(implode(' AND ', $conditions));

    $data = $q->execute($values, Doctrine_Core::HYDRATE_ARRAY);

    return $data;
}