порядок с заполнителями в DBIx::Class

Как правильно сгенерировать заказ, например, ORDER BY myfunction(col, ?, ?) DESC со значениями привязки в DBIx::Class?

В настоящее время я использую для этого буквальный SQL, но это не оптимально по нескольким причинам.

$rs->search(undef, { order_by => \"myfunction(col, $v1, $v2) DESC" });

person Eugene Yarmash    schedule 09.08.2012    source источник


Ответы (2)


Что-то вроде этого:

$rs->search(
    undef,
    {
        '+columns' => [{
            'res' => {
                'func' => ['me.col', \['?' => $val1], \['?' => $val2]],
                '-as'  => 'res',
            },
        }],
        'order_by' => {'-desc' => 'res'},
    }
);

будет генерировать (для MySQL и ($val1, $val2) = qw(val1 val2)):

SELECT `me`.`id`, ..., FUNC( `me`.`col`, ?, ? ) AS `res`
    FROM `table` `me`
    ORDER BY `res` DESC:
'val1',
'val2'
person Denis Ibaev    schedule 09.08.2012
comment
Это прекрасное решение, +1. Я буду придерживаться своего, потому что он заполняет дополнительный столбец в объекте Row (т. е. результат $row->get_columns будет содержать «res»), и это нарушит часть кода. - person Eugene Yarmash; 10.08.2012
comment
В качестве обходного пути вы можете пометить этот столбец (например, -res) и удалить его в расширенном методе DBIx::Class::Row::inflate_result(). - person Denis Ibaev; 10.08.2012

Мне удалось заставить DBIx::Class сгенерировать правильный ORDER BY. Вот код:

$rs->search(undef, {
    order_by => \[
        'myfunction(mycol, ?, ?) DESC', map [dummy => $_], $v1, $v2
    ]
});
person Eugene Yarmash    schedule 09.08.2012
comment
Кстати, это задокументировано в Литеральный SQL с заполнителями и значениями привязки (подзапросами) в SQL::Abstract - person Eugene Yarmash; 09.09.2012