2015-04-23 39 views
1

我有一個複雜的SQL語句,我想在DBIx中使用。 因此,我沒有把它建立爲「抽象」的美學方式,而是想爲這種特殊情況使用View(DBIx :: Class :: ResultSource :: View)。如何在DBIx :: Class視圖中構建動態SQL查詢

這裏是從原來的DBI代碼我查詢:

SELECT a."key", CASE WHEN $language = '' 
      THEN a."default" ELSE $language END AS lan 
FROM foo.regionlang as a 
INNER JOIN foo."displayPageKeys" as b ON a."key" = b."key" 
WHERE a.regions LIKE '%,$region,%' 
    AND b."displayPage" = ? 
UNION 
SELECT a."key", CASE WHEN $language = '' 
      THEN a."default" ELSE $language END AS lan 
FROM foo.regionlang as a 
INNER JOIN foo."displayPageKeys" as b ON a."key" = b."key" 
WHERE regions like '%,0,%' 
    AND b."displayPage" = ? 

所以,在我看來,它看起來像這樣:

__PACKAGE__->result_source_instance->is_virtual(1); 

__PACKAGE__->result_source_instance->view_definition(q[ 
SELECT a."key", CASE WHEN ? = '' 
      THEN a."default" ELSE ? END AS lan 
FROM foo.regionlang as a 
INNER JOIN foo."displayPageKeys" as b ON a."key" = b."key" 
WHERE a.regions LIKE '%,$region,%' 
    AND b."displayPage" = ? 
UNION 
SELECT a."key", CASE WHEN ? = '' 
      THEN a."default" ELSE ? END AS lan 
FROM foo.regionlang as a 
INNER JOIN foo."displayPageKeys" as b ON a."key" = b."key" 
WHERE regions like '%,0,%' 
    AND b."displayPage" = ? 
]); 

我試着使用綁定更換$語言打電話,我用我的查詢中替換任何值:

my @transl_hashrefs = $self->{schema}->resultset('View::Translation') 
     ->search(
      {}, 
      { 
       result_class => 'DBIx::Class::ResultClass::HashRefInflator', 
       bind => [ 
          $langmap, 
          $langmap, 
          $display_page, 
          $langmap, 
          $langmap, 
          $display_page, 
         ], 
      }) 
     ->all; 

我應該指出,該查詢被稱爲上的Postgres,所以工作SQL應該是這個樣子:

SELECT a."key", CASE WHEN "lang1" = '' 
      THEN a."default" ELSE "lang1" END AS lan 
FROM foo.regionlang as a 
INNER JOIN foo."displayPageKeys" as b ON a."key" = b."key" 
WHERE a.regions LIKE '%,$region,%' 
    AND b."displayPage" = 'home' 
UNION 
SELECT a."key", CASE WHEN "lang1" = '' 
      THEN a."default" ELSE "lang1" END AS lan 
FROM foo.regionlang as a 
INNER JOIN foo."displayPageKeys" as b ON a."key" = b."key" 
WHERE regions like '%,0,%' 
    AND b."displayPage" = 'home' 

的問題是,我得的$語言(「語言1」的價值)以某種方式使用雙引號(「」)在SQL中。這不工作使用綁定的方式,這是專爲價值觀,而不是我猜。

你也可以通過使用綁定VAR和訪問他們喜歡的$ 1,$ 2等的視圖。但即使如此,我也不能把價值放在雙引號內。

爲最有可能的,非常混亂的問題

對不起。我試圖讓它儘可能清楚。

任何幫助非常感謝!

歡呼

+1

我想知道,如果你需要的是更換'Q ['和'QQ ['(QQ允許可變插值),然後更換'?'和'$ language'。 – Vinbot

+0

感謝您的回覆!我忘了提及:我已經嘗試過qq。看起來DBIx在使用qq時不理解佔位符:聲明沒有佔位符綁定在/usr/local/share/perl5/DBIx/Class/Storage/DBI.pm行1889. at/usr/local/share/perl5/DBIx/Class/Schema.pm line 1077 – RandomAndy

+0

縮寫dir DBIx :: Class是DBIC而不是DBIx,它是一個完整的命名空間。 –

回答

2

我也有類似的問題,即普通的觀點並沒有幫助(主要是因爲如果你加入的視圖到其它表,添加其他標準和限制接受的行中,結合可以得到夾雜了params

我最終選擇的解決方案比您的需求複雜得多,但其根源是Ovid最近編寫的一個稱爲DBIx :: Class :: Report的模塊,它可能不在CPAN上,但它是在github,和他在這裏概括它:http://blogs.perl.org/users/ovid/2015/03/dbixclassreport---generate-ad-hoc-dbic-classes-from-sql.html

有了這個,你可以動態CR用任意SQL消除該視圖,因此可以插入在綁定中效果不佳的標識符,並且可以正常地爲安全/性能綁定其餘條件。

+0

這是一個非常好的主意,非常感謝!我一直在尋找這樣的事情,所以我會試試它是否適合我。 – RandomAndy