如何将原始 SQL 查询转换为 Silverstripe SQLQuery 抽象层

Posted

技术标签:

【中文标题】如何将原始 SQL 查询转换为 Silverstripe SQLQuery 抽象层【英文标题】:How to convert raw SQL query into Silverstripe SQLQuery abstraction layer 【发布时间】:2018-05-08 16:29:28 【问题描述】:

我有一个页面,我正试图从数据库中提取与该页面相关的文章。我的 SQL 查询可以提取我需要的内容,但我不断收到错误消息“‘where 子句’中的未知列‘时尚’”。我相信我需要将其转换为,

$FilteredStories =  DB::query(' SELECT C.ID, C.URLSegment, C.Title, B.Title AS "Category"
                                FROM `articlepage_categories` AS A
                                JOIN articlecategory AS B ON A.ArticleCategoryID = B.ID
                                JOIN sitetree AS C ON A.ArticlePageID = C.ID
                                WHERE B.Title = "Fashion" LIMIT 5')
                    ->value();

进入 SQLQuery 抽象层,但我不知道如何。有人可以告诉我如何创建具有多个连接的 SQLQuery 抽象层吗?

备注

我使用的是 Silverstripe 3.6.1 版 “时尚”当前是硬编码的,但将替换为 我将传入的变量。

【问题讨论】:

【参考方案1】:

SilverStripe 的数据库默认使用ANSIsql_mode,其中字符串字面量需要用单引号括起来。您需要将 "Fashion" 周围的双引号替换为单引号,如下所示:

$FilteredStories =  DB::query('SELECT C.ID, C.URLSegment, C.Title, B.Title AS "Category"
                            FROM `articlepage_categories` AS A
                            JOIN articlecategory AS B ON A.ArticleCategoryID = B.ID
                            JOIN sitetree AS C ON A.ArticlePageID = C.ID
                            WHERE B.Title = \'Fashion\' LIMIT 5')

因为外引号是单引号,所以在这里转义。

您的查询将用SQLSelect 表示,如下所示:

$filteredStories = SQLSelect::create();
$filteredStories->selectField('"sitetree"."ID", "sitetree"."URLSegment", "sitetree"."Title", "articlecategory"."Title" AS "Category"');
$filteredStories->setFrom('articlepage_categories');
$filteredStories->addLeftJoin('articlecategory', '"articlecategory"."ID" = "articlepage_categories"."ArticleCategoryID"');
$filteredStories->addLeftJoin('sitetree','"sitetree"."ID" = "articlepage_categories"."ArticlePageID"');
$filteredStories->addWhere('"articlecategory"."Title" = \'Fashion\'');
$filteredStories->setLimit(5);

【讨论】:

以上是关于如何将原始 SQL 查询转换为 Silverstripe SQLQuery 抽象层的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL 原始查询转换为 Linq

将原始 SQL 转换为 Laravel 查询构建器

如何将表达式树转换为部分 SQL 查询?

如何在 Laravel 6 中转换原始 sql 查询?

转换为 ActiveRecord 查询(火鸟数据库)时导致错误的原始 SQL 查询

如何让查询生成器将其原始 SQL 查询输出为字符串?