我在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'


我收到此错误:


  必须定义参数“ \”)和`path` NOT LIKE(\'bill /“。


我试图通过加前缀'来逃避各种字符,例如%\我怀疑会引起问题的字符,但是这给了我这样的错误:


  找到未知的转义字符“ \%”


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

最佳答案

问题是%,这是yaml中的特殊字符。

因此,有两种方法可以使它起作用:

要对其进行转义,必须在其前面加上另一个%,以便:

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


或者,您可以避免按照Jared的注释使用%,而是:

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

关于php - Symfony Sonata SEO自定义SQL查询与LIKE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58306515/

10-17 03:05