Разрешенный объем памяти исчерпан с помощью пользовательского запроса Propel2

(обновления внизу)

Я пытаюсь получить последнюю запись в моей таблице под названием «VersionHistory», и, поскольку для идентификатора установлено автоматическое увеличение, я пытаюсь получить максимальный идентификатор. Стараясь избегать сортировки всей таблицы в порядке убывания и занимая верхнюю позицию, я хочу минимизировать вычисления, требуемые для этого запроса, по мере роста таблицы, и эта таблица, вероятно, станет довольно большой быстро.

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. Есть идеи почему? Закомментирование запроса в конструкторе 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();

Удалил пользовательскую функцию, включил режим отладки propel, он выводит, что этот запрос выполняется:

[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 [] []

Все еще сталкивается с переполнением памяти.

3

Решение

Это все:

SELECT * FROM version_history ORDER BY id DESC LIMIT 1;
1

Другие решения

Из документации, withColumn делает следующее:

Propel добавляет столбец «with» в предложение SELECT запроса и
использует второй аргумент вызова withColumn () в качестве псевдонима столбца.

Итак, похоже, что вы на самом деле запрашиваете каждую строку в таблице, а также каждая строка запрашивает максимальный идентификатор.

Я ничего не знаю о Propel (кроме того, что я только что погуглил), но, похоже, вам нужен другой способ указать ваше условие «где».

1

Ваш сырой SQL и ваш Propel Query отличаются / не эквивалентны.

В запросе propel просто добавлен столбец, в то время как ваш необработанный SQL фактически содержит два запроса, один из которых является подзапросом для другого.

Так что вам нужно сделать эквивалент в Propel:

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

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

Обратите внимание ->select('LatestVersionID') поскольку вам нужно только скалярное значение, а не весь объект, а также виртуальный столбец (псевдоним в SQL), используя withColumn()

0
По вопросам рекламы [email protected]