(обновления внизу)
Я пытаюсь получить последнюю запись в моей таблице под названием «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 [] []
Все еще сталкивается с переполнением памяти.
Это все:
SELECT * FROM version_history ORDER BY id DESC LIMIT 1;
Из документации, withColumn делает следующее:
Propel добавляет столбец «with» в предложение SELECT запроса и
использует второй аргумент вызова withColumn () в качестве псевдонима столбца.
Итак, похоже, что вы на самом деле запрашиваете каждую строку в таблице, а также каждая строка запрашивает максимальный идентификатор.
Я ничего не знаю о Propel (кроме того, что я только что погуглил), но, похоже, вам нужен другой способ указать ваше условие «где».
Ваш сырой 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()