Выберите из нескольких таблиц в DBIx :: Class - PullRequest
3 голосов
/ 24 апреля 2009

У меня есть следующий 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 :: Class:

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 :: Class следующим образом:

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' ],
    });

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

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

Ответы [ 2 ]

4 голосов
/ 24 апреля 2009

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

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

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

А в Таблице 2:

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

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

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

НТН.

1 голос
/ 26 апреля 2009

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

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