shoorick: (Default)
shoorick ([personal profile] shoorick) wrote2011-04-13 04:32 pm

Какóго?!

Видимо, я ничё не понимаю в ORM вообще и DBIx::Class в частности.
Элементарная для чистого SQL задача: вывести отсортированный по алфавиту список людей может решаться, например, таким запросом:
SELECT CONCAT_WS(' ', lname, fname, sname) AS name
FROM user
ORDER BY name;
Попытки перевести этот запрос на DBIx::Class — сплошь и рядом безуспешные, не помогает ни бубен, ни чтение мануала. Точнее, чтение мануала помогло лишь в одном, понять, что атрибут as ничего не делает. Гугление тоже не особо помогает... По каким принципам в DBIx::Class используются всякие \, [] и {} — тоже не ясно, складывается ощущение, что как попало.

upd/16:50: Из всех методов один даёт почти такой запрос, какой надо. Но как странно это выглядит!
$c->model('Dbase::User')->search(
    {},
    {
        'select'   => [ { '' => \q{CONCAT_WS(' ', lname, fname, sname)}, -as => 'name' } ],
        'order_by' => [ 'name' ],
    }
)
upd/вечернее: Атрибут as всё-таки нужен. Но не для влияния на SQL (он на него не влияет), а для явного указания дбикс-классу имени нового поля.
'select' => [ 'id', { '' => \q{CONCAT_WS(' ', lname, fname, sname)}, -as => 'name' } ],
'as'     => [qw( id name )],
Если его не указать, то появляются сообщение об ошибке: «Метод name не существует».

[identity profile] nordicdyno.livejournal.com 2011-04-13 12:48 pm (UTC)(link)
а в сторону Rose::DB не смотрели?

Не смотрел

[identity profile] shoorick.livejournal.com 2011-04-13 01:16 pm (UTC)(link)
Не смотрел. Потому что на ужé работающем сайте менять ORM не стóит, наверное.

[identity profile] knutov.livejournal.com 2011-04-13 01:22 pm (UTC)(link)
btw, не во всех БД есть этот конкат, если я правильно помню - его нет у постгри. Поэтому, возможно, с этим проблемы.

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

upd: хотя не, у постгри гроуп конкат помоему нет...
Edited 2011-04-13 13:22 (UTC)

оффтоп, ну почти оффтоп...

[identity profile] monja74.livejournal.com 2011-04-13 11:24 pm (UTC)(link)
Иногда моя флента начинает меня пугать:

[identity profile] dionys2.livejournal.com 2011-04-14 11:51 am (UTC)(link)

Как-то так:

'columns' => [
    {
        'name' => {
            'concat_ws' => ["' '", 'lname', 'fname', 'sname'],
            '-as'       => 'name',
        },
    },
]

DBIx::Class умеет превращать ключи хешей в имена функций и ключевые слова.

[identity profile] dionys2.livejournal.com 2011-04-14 12:01 pm (UTC)(link)

Вернее так, чтобы символ пробела не воспринимался как имя поля:

'columns' => [
    {
        'name' => {
            'concat_ws' => [\[q(' ')], 'lname', 'fname', 'sname'],
            '-as'       => 'name',
        },
    },
]

еще вариант:

[identity profile] egor604.ya.ru (from livejournal.com) 2011-04-14 12:16 pm (UTC)(link)
search_rs(undef, {
select => [ \'CONCAT_WS(' ', lname, fname, sname) AS name' ],
as => ['name'],
order_by => ['name']
)

(Anonymous) 2011-04-17 07:12 am (UTC)(link)
В чем смысл этих ORM есди кусок кода по величине равен куску написанному на чистом DBI, а геммороя больше и сам код запутаней + общий оверхед самого ORM

В чём смысл

[identity profile] shoorick.livejournal.com 2011-04-17 03:43 pm (UTC)(link)
Видимо, в том, чтобы вместо SQL-запросов использовать ООП.

В простых случаях такой код выглядит достаточно симпатично. Но вот в сложных — начинается ужас и кошмар.