Видимо, я ничё не понимаю в ORM вообще и DBIx::Class в частности.
Элементарная для чистого SQL задача: вывести отсортированный по алфавиту список людей может решаться, например, таким запросом:
upd/16:50: Из всех методов один даёт почти такой запрос, какой надо. Но как странно это выглядит!
Элементарная для чистого 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 не существует».
no subject
Date: 2011-04-13 12:48 pm (UTC)Не смотрел
Date: 2011-04-13 01:16 pm (UTC)no subject
Date: 2011-04-13 01:22 pm (UTC)Ну и вообще подобное обсуждалось у меня в комментах примерно год назад и пришли к выводу, что лучше это делать программно в цикле уже после получения ссылки на весь массив.
upd: хотя не, у постгри гроуп конкат помоему нет...
оффтоп, ну почти оффтоп...
Date: 2011-04-13 11:24 pm (UTC)no subject
Date: 2011-04-14 11:51 am (UTC)Как-то так:
'columns' => [ { 'name' => { 'concat_ws' => ["' '", 'lname', 'fname', 'sname'], '-as' => 'name', }, }, ]DBIx::Classумеет превращать ключи хешей в имена функций и ключевые слова.no subject
Date: 2011-04-14 12:01 pm (UTC)Вернее так, чтобы символ пробела не воспринимался как имя поля:
'columns' => [ { 'name' => { 'concat_ws' => [\[q(' ')], 'lname', 'fname', 'sname'], '-as' => 'name', }, }, ]еще вариант:
Date: 2011-04-14 12:16 pm (UTC)select => [ \'CONCAT_WS(' ', lname, fname, sname) AS name' ],
as => ['name'],
order_by => ['name']
)
no subject
Date: 2011-04-17 07:12 am (UTC)В чём смысл
Date: 2011-04-17 03:43 pm (UTC)В простых случаях такой код выглядит достаточно симпатично. Но вот в сложных — начинается ужас и кошмар.