shoorick: (Default)
[personal profile] shoorick
Видимо, я ничё не понимаю в 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 не существует».

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

Не смотрел

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

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

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

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

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

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

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

Как-то так:

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

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

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

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

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

еще вариант:

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

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

В чём смысл

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

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

Profile

shoorick: (Default)
shoorick

December 2016

S M T W T F S
    1 23
45678910
11121314151617
18 19 2021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 21st, 2026 05:03 am
Powered by Dreamwidth Studios