2014-02-27 30 views
0

SELECT me.id,me.date_created,me.date_updated,me.yes, me.name,me.description,me.currency,me。鎖定,me.skip, me.uri_part,me.user_id, 是+貨幣作爲重量別名DBIx :: Class結果集中兩列的總和

FROM我具有((重量< 5))按重量計順序的想法;

怎樣才能在DBIx ::類,查詢,而無需使用文字SQL這樣的:

my $query = $rs->search({}, 
    { 
     '+select' => \[ 
      'yes + currency as weight', 
     ], 
     rows => 1, 
     order_by => { -desc => [qw/weight name/] }, 
     having => { 
      weight => { '<' => $self->yes + $self->currency }, 
     }, 
    }); 
    use Data::Dumper; 
    warn Dumper($query->as_query); 

我嘗試使用-as,但是,它似乎只能是有益的與生成列的工作從功能,這樣的:

'+select' => { 
    'yes + currency', '-as' => 'weight' 
} 

生成錯誤

「匿名散列中的奇數元素 /data/TGC/lib/TGC/DB/Result/Idea.pm line 105,line 1000. DBIx :: Class :: SQLMaker :: _ recurse_fields():格式不正確的選擇參數 - 太多鍵在哈希:標量(0xbf14c40),重」

回答

3

也許最習慣的事情我可以想想SQL中的抽象表達式,不用緊張:

#!/usr/bin/env perl 
use Modern::Perl; 

use MySchema; 
use Data::Dumper; 

my $schema = MySchema->connect('dbi:SQLite:example.db'); 

my $rs = $schema->resultset('Sample')->search(
    { 
    weight => { '<' => 5 }, 
    }, 
    { 
    '+select' => [ 
     { '' => \'`me`.`yes` + `me`.`currency`', -as => 'weight' } 
    ] 
    } 
); 


say Dumper($rs->as_query()); 

這是一個人爲包裝的列名,但它做的工作,有點。只是不知道任何方式摘要在這裏+。但STIL:

'(SELECT me.name,me.yes,me.currency,(me.yes + me.currency)AS體重從樣品我(重量<)?)',

除非你只是去爲慣用的Perl,在這種情況下:

{ '' => \(join " + ", qw/`me`.`yes` `me`.`currency`/), -as => 'weight' } 

但無論哪種方式似乎有點做作考慮兩種形式比文字串長。

還要注意的是weightWHERE,而不是HAVING這是因爲各種SQL引擎炸燬引用。

+0

我更新了原始查詢以修復基本的SQL語法問題。最重要的是,我認爲我們可能運行不同版本的SQL :: Abstract或DBIx :: Class,因爲我沒有得到與您一樣的查詢(在用您的建議子句修改原始數據後): SELECT 'me'.'id','me'.'date_created','me'.'date_updated','me'.'''','me'.'name','me'.'description','me '.'currency','me'.'locked','me'.'skip','me'.'uri_part','me'.'user_id',('me'.'yes + me'.''貨幣')作爲'重量'從'想法''我'有'重量'<? ORDER BY'weight' DESC,'name' DESC LIMIT?) – perlDreamer

+0

您是否在談論引用?那是因爲你已經實施了「DBI驅動程序」。我所說的** HAVING **是**在每個**數據庫後端都不會被**支持。所以即使它產生了,如果你切換數據庫,這可能會炸燬**。 –

+0

@perlDreamer忘記在評論上標記你 –

0

的‘+作爲’應該是在同一級別爲‘+選擇’

$idea = $rs->search({-and => [ 
    name => { '<' => $self->name }, 
]}, 
{ 
    '+select' => [ 
     'yes + currency' 
    ], 
    '+as' => [qw/weight/], 
    rows => 1, 
    order_by => ['weight', 'name'], 
    having => { 
     weight => { '<' => $self->yes + $self->currency }, 
    }, 
})->single; 
+0

+因爲不會創建'select this as that that from table' syntax。 從[ResultSet文檔](http://search.cpan.org/~ribasushi/DBIx-Class-0.08270/lib/DBIx/Class/ResultSet.pm#as) 「as」屬性沒有任何內容使用SQL端AS。詳情請參閱「選擇」。 – perlDreamer

+0

@perlDreamer實際上它是http://search.cpan.org/~ribasushi/DBIx-Class-0。08270/lib/DBIx/Class/Manual/Cookbook.pod#Using_database_functions_or_stored_procedures – alex

+0

@perlDreamer我編輯了答案 – alex