带有 LIKE 的 Symfony Sonata SEO 自定义 sql 查询

Posted

技术标签:

【中文标题】带有 LIKE 的 Symfony Sonata SEO 自定义 sql 查询【英文标题】:Symfony Sonata SEO custom sql query with LIKE 【发布时间】:2020-02-06 22:20:34 【问题描述】:

我在 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 中运行查询,它会按预期工作。

如果我像这样通过奏鸣曲 seo 命令行实用程序运行它:

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

我收到此错误:

必须定义参数 "\') AND `path` NOT LIKE(\'bill/"。

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

发现未知转义字符“\%”

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

【问题讨论】:

你可以说LEFT(path, 9) != 'checkout/' 【参考方案1】:

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

所以有两种方法可以让它工作:

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

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

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

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

【讨论】:

以上是关于带有 LIKE 的 Symfony Sonata SEO 自定义 sql 查询的主要内容,如果未能解决你的问题,请参考以下文章

在 Symfony 2 项目的 Sonata Admin 中使用自定义视图页面进行图像预览

在 Sonata symfony 4 中创建管理员用户

Symfony3.1 & Sonata Admin - 列表字段的模板被忽略

sonata AdminBlockServiceInterface 弃用,以明确安装 symfony 2.8 + sonata 3.10

Symfony 4 + Sonata + Sonata Doctrine ORM Admin Bundle:错误:没有要处理的元数据类

自定义 Sonata 管理仪表板 - Sonata 和 Symfony 2