| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 штука весьма продуманная, но что то вроде этого должно работать:
|
| Автор: andzol 16.6.2011, 22:45 |
| спасибо за идею. обязательно попробую и посмотрю на бенчмарки заодно.... |