我有一個複雜的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等的視圖。但即使如此,我也不能把價值放在雙引號內。
爲最有可能的,非常混亂的問題對不起。我試圖讓它儘可能清楚。
任何幫助非常感謝!
歡呼
我想知道,如果你需要的是更換'Q ['和'QQ ['(QQ允許可變插值),然後更換'?'和'$ language'。 – Vinbot
感謝您的回覆!我忘了提及:我已經嘗試過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
縮寫dir DBIx :: Class是DBIC而不是DBIx,它是一個完整的命名空間。 –