我正在尝试建立一种方法来提供翻译,只要找不到翻译,它就可以回退到提供原始文本。
我有一些“标准”表,其中包含原始语言中的各种内容(帖子、菜单等),然后是一个“主”翻译表,其中包含由语言键标识的翻译值、内容类型参考和翻译项目的ID。
例如:
table_posts
id | title | slug
-------------------------------
8 | test contenuto | test-contenuto
表翻译
id | title | slug | item_id | item_type | language
----------------------------------------------------
1 | test content | test-content | 8 | 1 | 2
在搜索 id 或没有 where 子句时,我设法让它工作,但每当我需要基于 slug 进行搜索时,我都会卡住。我想要的是,如果 slug 是“关于我们”但翻译表中没有条目,它应该搜索原始语言的相应内容,反之亦然。
到目前为止,我设法使用 IFNULLs(或 COALESCEs)来提供找到的内容,但我无法找到一种可靠的方法来放入 WHERE 条件。
这个查询。例如,作品:
SELECT c.id,
COALESCE(
(SELECT t.slug FROM translations t WHERE t.id_item = c.id
AND t.item_type = 1 AND t.language= 2), c.slug
) slug,
COALESCE(
(SELECT t.testo FROM translations t WHERE t.id_item = c.id
AND t.item_type = 1 AND t.language= 2), c.testo
) testo,
FROM content c
WHERE c.type= 2 AND c.status = 1 AND c.trash = 0
相反,对于这样的查询,我真的无法解决:
SELECT cat.id,
COALESCE (
(SELECT t.name FROM translations t WHERE t.id_item = cat.id
AND t.item_type = 2 AND t.language = 2), cat.name
) name
FROM product_categories cat
WHERE cat.slug =....
我一辈子都不能告诉它搜索翻译的 slug,如果在翻译表中找不到,则获取原始 slug 并使用它来获取翻译内容(如果有,则获取原始内容)。
我希望我清楚它应该如何工作......我现在担心的是我从错误的角度看待问题,并且有更简单的方法来解决这个问题。我尝试查看第三方代码,例如 Joomla 的“JoomFish”扩展,以了解它是如何工作的,但这是循环和内部循环的三重奏,我无法真正理解它。
有没有更好的方法来解决这个问题?一般是怎么做的?我是否需要重构整个数据库架构,比如为每种语言使用一个表?
编辑:
我正在使用 WHERE 子句在具有该 slug 的翻译表中搜索指定的记录;如果没有找到它,则意味着我们正在寻找原始语言的网站,或者我们正在寻找另一种语言但缺少翻译(该作品的)。总而言之,我的意图是:
我有仅由蛞蝓制作的 URL。那么当蛞蝓是另一种语言时,我该如何搜索内容呢?