3

我有以下 DBIx::Class 代码:

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

当我尝试在resultset上执行next时,出现异常“Not an ARRAY reference” 。请注意,我不允许在 DBIx::Class中使用join ,作为引用者附属表,与 *table*** 表没有关系。

如何让 DBIx::Class 代码等效于 SQL 多选表?

4

2 回答 2

4

如果您在 table1/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,它会为你创建你需要的连接。

HTH。

于 2009-04-24T12:49:47.280 回答
1

我可以简单地创建一个视图来映射那些 WHERE 和 FROM 语句,而不是在 DBIx 中手动编码复杂的查询。然后,只需使用单行 DBIx :

$bom_schema->resultset('View_Of_Table1_And_Table2_And_Referrers_And_Affiliates');
于 2009-04-26T16:15:55.520 回答