翻訳を提供する方法を構築しようとしています。翻訳が見つからない場合はいつでも元のテキストを提供するためにフォールバックできます。
元の言語でさまざまな種類のコンテンツ (投稿、メニューなど) を保持する「標準」テーブルと、言語キー、コンテンツ タイプ参照によって識別される翻訳された値を保持する「マスター」翻訳テーブルがあります。翻訳されたアイテムのID。
例えば:
table_posts
id | title | slug
-------------------------------
8 | test contenuto | test-contenuto
table_translation
id | title | slug | item_id | item_type | language
----------------------------------------------------
1 | test content | test-content | 8 | 1 | 2
id を検索するとき、または where 句を使用せずに機能させることができましたが、スラッグに基づいて検索する必要があるときはいつでも立ち往生しています。私が望むのは、スラッグが「私たちについて」であるが、翻訳テーブルにエントリがない場合、元の言語でそれぞれのコンテンツを検索する必要があるか、またはその逆であるということです。
これまでのところ、見つかったコンテンツを提供するために IFNULL (または COALESCE) を使用することができましたが、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 =....
私の人生では、翻訳されたスラッグを検索するように指示することはできません。翻訳テーブルに見つからない場合は、元のスラッグを取得し、それを使用して翻訳されたコンテンツを取得します(存在する場合は元を取得します)。
それがどのように機能するかを明確にしたことを願っています...私の心配は、問題を間違った角度から取ったことであり、これを解決するためのはるかに簡単な方法があります。Joomla の「JoomFish」拡張機能などのサードパーティ コードを調べて、それがどのように機能するかを確認しようとしましたが、それはループと内部ループの 3 つの要素であり、実際には理解できません。
これを解決するより良い方法はありますか?通常はどのように行われますか?各言語のテーブルを使用するなど、DB スキーマ全体をリファクタリングする必要がありますか?
編集:
WHERE 句を使用して、そのスラッグを持つ変換テーブルで指定されたレコードを検索しています。見つからない場合は、サイトを元の言語で探しているか、別の言語で探しているが (その部分の) 翻訳が見つからないことを意味します。全体として、私の意図は次のとおりです。
ナメクジのみで作成された URL があります。では、スラッグが別の言語である場合、コンテンツを検索するにはどうすればよいでしょうか?