3

底部更新

我试图在我的表中获取名为“VersionHistory”的最新条目,并且由于 ID 设置为自动递增,因此我试图获取最大 ID。试图避免按降序对整个表进行排序并取顶部,因为我想随着表的增长最小化该查询所需的计算,并且该表可能会很快变得非常大。

class VersionHistoryQuery extends BaseVersionHistoryQuery {
    public function getLatestVersion() {
        return $this
            ->withColumn('MAX(version_history.id)')
            ->limit(1);
    }
}

我在 VersionHistory 构造函数中调用该函数,如下所示:

class VersionHistory extends BaseVersionHistory {
    public function __construct($backupPath = "") {
        $lastVersion = VersionHistoryQuery::create()
            ->getLatestVersion()
            ->find();
        $lastVersion->setBackupPath("backup/" . $backupPath);
        $lastVersion->save();
        parent::setImportedAt(date("Y-m-d H:i:s"));
    }    
}

这会在 php.ini 中输出“允许的内存大小已耗尽”错误。知道为什么吗?在 VersionHistory 构造函数中注释掉查询修复了错误,所以它在查询中的某个地方。我尝试按照此处的说明设置自定义查询:http: //propelorm.org/documentation/03-basic-crud.html#using-custom-sql。但我无法让它发挥作用。跑步:

SELECT * FROM version_history WHERE id = (SELECT MAX(id) FROM version_history)

从 MySQL 工作台工作得很好而且很快。

关于我做错了什么的任何想法?

我试过的

将代码更新为:

    public function getLatestVersion() {
        return $this
        ->orderById('desc')
        ->findOne();
    }

仍然得到相同的内存分配错误。


将代码更新为:

        $lastVersion = VersionHistoryQuery::create()
        ->orderById('desc')
        ->findOne();

删除了自定义函数,打开推进调试模式,它输出这个查询运行:

[2015-10-11 17:26:54] shop_reporting_db.INFO: SELECT `version_history`.`id`, `version_history`.`imported_at`, `version_history`.`backup_path` FROM `version_history` ORDER BY `version_history`.`id` DESC LIMIT 1 [] []

仍然遇到内存溢出。

4

3 回答 3

1

从文档中,withColumn执行以下操作:

Propel 将 'with' 列添加到查询的 SELECT 子句中,并使用 withColumn() 调用的第二个参数作为列别名。

因此,看起来您实际上是在查询表中的每一行,而且每一行都在查询最大 ID。

我对推进一无所知(除了我刚刚用谷歌搜索的内容),但看起来你需要一种不同的方式来指定你的 where 条件。

于 2015-10-11T20:39:24.267 回答
1

就这样:

SELECT * FROM version_history ORDER BY id DESC LIMIT 1;
于 2015-10-11T20:32:31.367 回答
0

您的原始 SQL 和您的 Propel 查询是不同的/不等价的。

在推进查询中仅添加了一列,而您的原始 SQL 实际上有两个查询,其中一个是另一个的子查询。

所以你需要在 Propel 中做同样的事情:

$lastVersionID = VersionHistoryQuery::create()
    ->withColumn('MAX(id)', 'LastVersionID')
    ->select('LastVersionID')
    ->findOne();

$lastVersion = VersionHistoryQuery::create()
    ->filterByVersionHistory($lastVersionID)
    ->find();

请注意,->select('LatestVersionID')因为您只需要一个标量值而不是整个对象,以及使用的虚拟列(SQL 中的别名)withColumn()

于 2017-08-11T19:19:52.270 回答