2009-04-24 2 views
3

У меня есть следующий код DBIx :: Класс:Выбрать из нескольких таблиц в DBIx :: Класс

my $where = 'me.loginid = ? AND me.code = ?'; 
my @bind = ($loginID, $code); 
my $tip_signals = $bom_schema->resultset('Table1')->search_literal(
    $where, @bind, 
    { 
     join => 'table2', 
     group_by => [ 'me.id' ], 
     '+select' => [ {'count' => '*'}, 'table2.id' ], 
     '+as'  => [ 'Count', 'ID' ], 
    }); 

Следующий оператор SQL был создан на основе вышеприведенного кода DBIx :: Класс:

SELECT me.id, me.loginid, me.tipster_date, me.code, me.short_code_without_payout, COUNT(*), table2.id 

FROM table1 me LEFT JOIN table2 table2 ON table2.tip_signals_id = me.id 

WHERE ( 
me.loginid = 'yccheok' AND me.code = 'ALIBABA_CODE' 
) 

GROUP BY me.id 

Теперь я хочу получить результат из 4 таблиц. Я пишу свой собственный код SQL вручную:

SELECT me.id, me.loginid, me.tipster_date, me.code, me.short_code_without_payout, COUNT(*), table2.id 

FROM table1 me, table2, referrers, affiliates 

WHERE ( 
me.loginid = 'yccheok' AND me.code = 'ALIBABA_CODE' 

and table2.tip_signals_id = me.id 
and referrers.affiliates_id = affiliates.id 
and affiliates.loginid = me.loginid 
and referrers.loginid = table2.loginid 
) 

GROUP BY me.id 

Я пытаюсь перевести выше SQL заявление в DBIx :: Класс следующим образом:

my $where = 'me.loginid = ? AND me.code = ? AND table2.tip_signals_id = me.id AND referrers.affiliates_id = affiliates.id AND affiliates.loginid = me.loginid AND referrers.loginid = table2.loginid'; 
my @bind = ($loginID, $code); 
my $tip_signals = $bom_schema->resultset('Table1')->search_literal(
    $where, @bind, 
    { 
     from  => [ {table2=>'table2'}, {referrers=>'referrers'}, {affiliates=>'affiliates'} ], 
     group_by => [ 'me.id' ], 
     '+select' => [ {'count' => '*'}, 'table2.id' ], 
     '+as'  => [ 'Count', 'ID' ], 
    }); 

я получаю исключение «Не ссылку ARRAY» в то время как я пытаюсь выполнить следующийрезультаты поиска. Обратите внимание, что мне не разрешалось использовать join в DBIx :: Class, as источники и аффилированные лица столы, не имеют отношения к * таблицам *** таблиц.

Как я могу получить DBIx :: Класс, эквивалентный таблице множественных отображений SQL?

ответ

1

Вместо сложного запроса с ручной кодировкой в ​​DBIx я могу просто создать представление для составления списка этих операторов WHERE и FROM. Затем, используя только одну строку DBIx:

$bom_schema->resultset('View_Of_Table1_And_Table2_And_Referrers_And_Affiliates'); 
3

Если у вас нет отношений между таблицей 1/2 и реферерами/филиалами, то почему бы не создать их в классах результатов DBIx :: Class?

Вы не наклеить те, так что я делаю предположение здесь, вы хотите добавить что-то вроде этого к классу Table1:

__PACKAGE__->has_many('affiliates', 'MyDB::Schema::Affiliate', 'loginid'); 

И в Table2:

__PACKAGE__->has_many('referrers', 'MyDB::Schema::Referrer', 'loginid'); 

Исправьте эти имена классов в соответствии с вашими фактическими классами.

Я предполагаю, что вы использовали Schema :: Loader для загрузки ваших таблиц, и он не создавал их для вас, поскольку ваша база данных не имеет соответствующих внешних ключей? DBIx :: Class не волнует, вы вполне можете настроить в нем больше отношений, которые не являются фактическими FK, и он создаст необходимые вам соединения.

HTH.