Symfony Sonata SEO 自定义 sql 使用 LIKE 查询

Symfony Sonata SEO custom sql query with LIKE

我在 Symfony 4 项目上使用 Sonata SEO。

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'

我收到这个错误:

The parameter "\') AND `path` NOT LIKE(\'bill/" must be defined.

我试图转义各种字符,例如 '%,我怀疑它们是通过前缀 \ 引起问题的,但是这给了我这样的错误这个:

Found unknown escape character "\%"

如何在 yaml 中正确转义此查询,以便它 运行?

问题出在 %,它是 yaml 中的一个特殊字符。

所以有两种方法可以让它发挥作用:

要转义它,需要在它前面加上另一个 % 所以:

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

或者,您可以根据 Jared 的评论避免使用 %,而是:

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