Как преобразовать необработанный SQL-запрос в слой абстракции Silverstripe SQLQuery - PullRequest
0 голосов
/ 08 мая 2018

У меня есть страница, на которой я пытаюсь получить статьи, связанные со страницей, из базы данных. У меня есть SQL-запрос, который извлекает то, что мне нужно, но я получаю сообщение об ошибке «Неизвестный столбец« Мода »в« предложении где »». Я считаю, что мне нужно конвертировать из,

$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 Ответ

0 голосов
/ 11 мая 2018

В базе данных SilverStripe по умолчанию используется ANSI sql_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);
...