Сортировка псевдо столбцов - PullRequest
1 голос
/ 22 октября 2011

В основном я хочу создать псевдостолбец, по которому я буду сортировать.Это мой SQL-запрос

SELECT I.*, ((I.width*175)/I.height) as relativeWidth
FROM Image I
order by relativeWidth asc

Как я могу сделать это в Propel без написания прямого SQL?и я не хочу делать вид и запрашивать его.

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Используете ли вы Критерии (старый способ создания предложения where)?Если это так, вы можете просто сделать:

$c = new Criteria();
$c->addSelectColumn(
    '((' . IPeer::WIDTH . '*175)/' . IPeer::HEIGHT . ') AS relativeWidth'
);
$c->addAscendingOrderByColumn('relativeWidth');
$rows = IPeer::doSelect($c);

Вам также нужно переопределить метод hydrate () в вашем классе строк (I), чтобы захватить дополнительный столбец (непроверенный):

public function hydrate($row, $startcol = 0, $rehydrate = false)
{
    $startcol = parent::hydrate($row, $startcol, false);
    $this->relativeWidth = ($row[$startcol] !== null) ? (float) $row[$startcol] : null;
    $this->resetModified();

    $this->setNew(false);

    if ($rehydrate) {
        $this->ensureConsistency();
    }

    return $startcol + 1;
}

Наконец, конечно, вам понадобится геттер для нового значения, но это просто.

Если вы используете систему запросов, возможно, есть аналогичный способ сделать это, хотя я меньшезнакомы с ним.

(Правка: добавлено возвращаемое значение для корректности.)

0 голосов
/ 27 октября 2011

Такие требования возможны в версии 1.5+ Propel. Настоятельно рекомендуется обновить , поскольку он полностью обратно совместим с множеством новых функций и исправлений.

Вам просто нужно узнать о новом API ActiveQuery, а не о хороших критериях. Таким образом, вы можете решить свою проблему, используя «виртуальные столбцы», просто посмотрите здесь: http://www.propelorm.org/reference/model-criteria.html#adding_columns

Если вы используете Propel внутри Symfony, просто установите sfPropelORMPlugin из https://github.com/propelorm/sfPropelORMPlugin и следуйте файлу README, чтобы он заработал.

Удачи!

...