Symfony Sonata SEO пользовательский SQL-запрос с LIKE - PullRequest
0 голосов
/ 09 октября 2019

Я использую Sonata SEO в проекте Symfony 4.

sonata-project/seo-bundle: ^2.7

В моем файле config/packages/sonata_seo.yaml я определил пользовательский запрос SQL для создания карты сайта следующим образом:

sitemap:
    doctrine_orm:
        - { connection: doctrine.dbal.default_connection, route: catch_all, parameters: {path: null}, query: "SELECT `path`, `updated_at` AS `lastmod`, 'weekly' AS `changefreq`, '0.5' AS `priority` FROM `pages` WHERE `published` = 1 AND `path` NOT LIKE('checkout/%') AND `path` NOT LIKE('bills/%%')" }

Для облегчения чтения (yaml заставляет меня иметь это в одной строке), вот запрос:

SELECT `path`, `updated_at` AS `lastmod`, 'weekly' AS `changefreq`, '0.5' AS `priority` 
FROM `pages` 
WHERE `published` = 1 AND `path` NOT LIKE('checkout/%') AND `path` NOT LIKE('bills/%')

В основном я использую WHERE NOT LIKE, чтобы исключить определенные страницы изгенерируется карта сайта.

Если я запускаю запрос в mysql напрямую, он работает как положено.

Если я запускаю его через утилиту командной строки sonata seo, например:

php bin/console sonata:seo:sitemap '/path/to/sitemap/folder' 'https://dev.test'

Я получаю эту ошибку:

Параметр "\ ') И` путь` НЕ НРАВИТСЯ (\ "bill /" должен быть определен.

У меня естьпытался экранировать различные символы, такие как ' и %, которые я подозревал в возникновении проблемы, используя префикс \, однако это выдает мне такие ошибки:

Обнаружено неизвестноescape-символ "\%"

Как правильно экранировать этот запрос в yaml, чтобы он выполнялся?

1 Ответ

0 голосов
/ 11 октября 2019

Проблема была в %, который является специальным символом в yaml.

Таким образом, есть два способа заставить это работать:

Чтобы избежать этого, ему должен предшествоватьдругим % так:

AND `path` NOT LIKE('checkout/%%')

В качестве альтернативы вы можете избежать использования % согласно комментарию Джареда и вместо этого сделать:

LEFT(path, 9) != 'checkout/'
...