Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > dbic + left outer join


Автор: andzol 15.6.2011, 22:26
здравствуйте всем.

есть следующая задача

table A (id)
table B(id)
table A_B(idA NOT NULL ,idB NOT NULL)

требуется сделать запрос средствами dbic следующего типа

select * from B LEFT OUTER JOIN A_B AS ab ON ab.idB=B.id AND ab.idA=? WHERE ab.idB IS NULL; , [BIND => 123]

т.е. выбрать из В все id, которых нет в множестве А_В для конкретного id из множества А

поковыряв dbic::relationship очевидного решения не нашел, поэтому дабы не сломать голову окончательно решил пока остановиться на следующем решении
делаем M:M A<->B = А_В


над множеством A_B делаю dbic::resultsource::view (is_virtual=1 естественно) с указанным выше запросом

т.о. для получения объекта из множества B мне надо будет сделать примерно следующее

X=resultset('virtual_view_A_B')->search({},{bind=>[123]})->first;
X->id - это ИД из множества В, которых нет в множестве А_В для элемента 123 из множества А, и теперь по этому ИД можно получить объект:
Bobj=resultset('B')->find(X->id);



вопрос:

как можно переделать вышеизложенное, чтобы на выходе получить примерно следующее:
Bobj=resultset('какая-то хитрая конструкция?_A_B')->find({idA=>123});

т.е. вместо 2х запросов делать 1,  но хитрый.
нужно ли это делать в общем случае и оптимально ли мое решение в данном(выше) случае?

спасибо

Автор: EcSYZ 16.6.2011, 16:21
Точно сказать не могу, ибо Join`ы в DBIX::Class штука весьма продуманная, но что то вроде этого должно работать:
Код

$DBIx->resultset('B')->search({
   'A_B.idA' => 123,
   'A_B.idB' => { 'IS' =>undef }
},
{
   'join'    => [qw/A_B/],
   'select' => ['me.id'],
   'as'      => ['id']
});

Автор: andzol 16.6.2011, 22:45
спасибо за идею. обязательно попробую и посмотрю на бенчмарки заодно....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)