首页 > 解决方案 > 多语种网站显示 按语言或默认发布

问题描述

我正在用 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

谢谢你的任何建议。

标签: phpsqlsymfonydoctrinetranslate

解决方案


如果您每次只返回一条记录,并且如果找不到所需的语言,总是返回“*”,一种方法是:

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

推荐阅读