Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wielojęzykowość
Forum PHP.pl > Forum > Bazy danych > MySQL
x11100b
mamy tabele:

Produkty
- id INTEGER
- cena INTEGER

Opisy_produktow
- id INTEGER
- id_produktu INTEGER
- id_jezyka INTEGER
- opis TEXT

Jezyki
- id INTEGER
- blank VARCHAR(255)

w polu "blank" tablicy "Jezyki" przetrzyumujemy tekst inforacyjny typu: dla pl. - "brak informacji w jezyku polskim, wybierz inny jezyk", a dla np. ang. - "information in english not availiable, choose different language"

powiedzmy, ze w sesji trzymamy id aktualnie uzywanego jezyka - chce wydobyc z bazy informacje o cenach produktow z opisami w aktualnym jezyku - a jesli takiego opisu dla aktualnego jezyka nie ma - chce dostac informacje "jezyki.blank"

czy takie podejscie do wielojezykowosci ma sens dla duzych projektow?

uprzejmie prosze o propozycje zapytan realizujacych wydobycie informacji o produktach w danym jezyku - ja nie umiem wymyslic zgrabnego rozwiazania tego problemu....

pozdrawiam,
Lukasz

moze nakresle problem troche dokladniej - w pokazanej wyzej strukturze, zalozmy, ze uzywamy jezyka o ID=1, i wyswietlamy informacje o produktach - uzywam takiego zapytania mysql:

  1. SELECT produkty.id, produkty.cena, opisy_produktow.opis
  2. FROM produkty, opisy_produktow
  3. WHERE opisy_produktow.id_jezyka = 1
  4. AND opisy_produktow.id_produktu = produkty.id


problem pojawia sie, gdy pewien produkt nie ma opisu w rzadanym jezyku (wtedy jest on pomijany na liscie, a wedlug zalozen - powinna byc wyswietlana informacja z tabeli jezyki "brak informacji w jezyku polskim", lub odpowiednio przetlumaczony ten tekst na inne jezyki)

wiadomo wiec, ze zapytanie powinno w FROM zawierac tabele jezyki:

  1. FROM produkty,opisy_produktow, jezyki


oraz, ze SELECT powinien uwzgledniac warunkowosc wartosci kolumny opis:

  1. SELECT produkty.id, produkty.cena, IF(??WARUNEK??, opisy_produktow.opis, jezyki.blank)


skladajac wszystko w calosc otrzymujemy pewien wzor zapytania do dopracowania:

  1. SELECT produkty.id, produkty.cena, IF(??WARUNEK??, opisy_produktow.opis, jezyki.blank)
  2. FROM produkty, opisy_produktow, jezyki
  3. WHERE opisy_produktow.id_jezyka = 1
  4. AND jezyki.id = 1
  5. AND opisy_produktow.id_produktu = produkty.id


jednak nie umiem wymyslic zgrabnego warunku... sciana.gif
Echonik
  1. SELECT
  2. produkty.id,
  3. produkty.cena,
  4. case when opisy_produktow.opis IS NULL OR opisy_produktow.opis = '' then
  5. jezyki.blank
  6. else
  7. opisy_produktow.opis
  8. end 'opis'
  9. FROM produkty
  10. JOIN opisy_produktow ON id_produktu = produkty.id
  11. JOIN jezyki ON jezyki.id = opisy_produktow.id_jezyka


O to chodziło?
x11100b
Echonik - dzieki za zainteresowanie tematem, najprostrze rozwiazanie do jakiego udalo mi sie dotrzec opiera sie na LEFT JOIN oraz IFNULL:

  1. SELECT produkty.id, produkty.cena, IFNULL(opisy_produktow.opis, jezyk.blank)
  2. FROM produkty LEFT JOIN opisy_produktow ON (opisy_produktow.id_jezyka = 1 AND opisy_produktow.id_produktu = produkty.id), jezyki
  3. WHERE jezyki.id = 1


pozdrawiam,
Lukasz

PS> co sadzicie o takim podejsciu do wielojezykowosci systemu?
erix
Temat: Wielojezykowosc
Echonik
Cytat(x11100b @ 15.10.2010, 14:50:43 ) *
  1. SELECT produkty.id, produkty.cena, IFNULL(opisy_produktow.opis, jezyk.blank)
  2. FROM produkty LEFT JOIN opisy_produktow ON (opisy_produktow.id_jezyka = 1 AND opisy_produktow.id_produktu = produkty.id), jezyki
  3. WHERE jezyki.id = 1


Skrypt jest OK, jeśli bierzesz pod uwagę to, że ma wyświetlić opis produktu, który posiada same spacje lub puste (nie mówię o wartości NULL, bo to nie jest to samo, co '').
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.