php - 多语种网站显示 按语言或默认发布
问题描述
我正在用 symfony 我的文章表编写一个多语言网站:
ID | original_id | rubrique_id | 地位 | 郎 | 更新时间 | 标题 |
---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | zh | 2021-02-16 00:01:00 | pede libero en |
2 | 1 | 1 | 1 | FR | 2021-02-16 00:02:00 | pede libero Fr |
3 | 1 | 1 | 1 | * | 2021-02-16 00:03:00 | pede libero 全部 |
4 | 4 | 1 | 1 | FR | 2021-02-16 00:04:00 | rhoncus aliquet Fr |
5 | 4 | 1 | 1 | * | 2021-02-16 00:05:00 | rhoncus aliquet 全部 |
该表还包含其他字段以及与表部分的关系
我想根据语言“en”显示一篇文章如果没有找到语言“en”则显示“*”
我试过了 :
SELECT a
FROM App\Entity\Article
WHERE (a.lang = 'en' OR a.lang = '*')
GROUP BY a.original
ORDER BY a.updatedAt DESC
根据@eshirvana 先生的解决方案
询问 :
SELECT p, r FROM App\Entity\Article
p INNER JOIN p.rubrique r
WHERE (p.lang = :value_0 OR p.lang = :value_1)
AND p.status = :stat AND r.status = :rstat
GROUP BY p.original
ORDER BY p.updatedAt DESC, p.lang DESC
它总是向我显示最后一个添加
我改进了@eshirvana 先生提出的解决方案二
解决方案
SELECT * FROM `articles` as post
WHERE status = 1
AND (
post.lang = 'en'
OR (
NOT(EXISTS(SELECT * FROM `articles` as subpost
WHERE subpost.lang = 'en'
AND subpost.status = 1
AND subpost.original_id = post.original_id))
AND post.lang = '*'
)
)
ORDER BY updated_at DESC
谢谢你的任何建议。
解决方案
如果您每次只返回一条记录,并且如果找不到所需的语言,总是返回“*”,一种方法是:
SELECT TOP 1 *
FROM App\Entity\Article a
WHERE a.lang IN ( 'es', '*')
GROUP BY a.original
ORDER by a.lang DESC , a.updatedAt DESC
但防弹方法是:
SELECT *
FROM `articles`
WHERE (lang = 'fr'
OR (
not exists(select 1 FROM `articles` WHERE lang = 'fr')
and lang = '*'
)
)
GROUP BY original_id
ORDER BY updated_at DESC
推荐阅读
- javascript - 如何正确编写插件代码成功?
- r - dplyr::coalesce,但对于多行
- javascript - 根据鼠标位置旋转 div
- javascript - 在静态 HTML 中包含 Puppeteer (javascript) 代码
- kdb - 如何将 kdb RDB 设置为仅订阅 tickerplant 中的某些表
- java - 将 JsonSchema 解析为 io.swagger.v3.oas.models.media.Schema
- installation - 赛普拉斯不会在安装时创建目录
- c# - 如何通过用户输入(控制台应用程序)在 C# 中使用带有 List 的 IndexOf 方法自动增加 int userid?
- php - 在 Eloquent 中将数据透视表与多个表连接起来
- ruby-on-rails - 无法使用 rails react 和 nginx 启动 docker 容器