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

結果セットでnextを実行しようとすると、「配列参照ではありません」という例外が発生します。DBIx::Class で結合を使用することは許可されていないことに注意してください。リファラーおよびアフィリエイトテーブルは *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

DBIx で手作業で複雑なクエリをコーディングする代わりに、ビューを作成して WHERE ステートメントと FROM ステートメントをマップするだけです。次に、DBIx の単一行を使用するだけで:

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