Autor Zpráva
Manny
Profil
Potřebuji poradit správný postup.
Konkrétně mám tabulku s jednotlivými typy dovolenkových ubytování a k nim potřebuji vypisovat seznam ikon s parametry ubytování (parkoviště, polopenze, wi-fi atd.), které jsou v druhé tabulce asi o cca 20 řádcích.
První nápad byl doplnění 1. tabulky sloupcem se sadou příslušných idecek z tabulky 2. Získaný řetězec potom projet přes explode() a vypsat sadu ikon.
Může to tak být? Nebo existuje lepší řešení?
aDAm
Profil
spojovací tabulka o dvou sloupcích? id_typ a id_ikona?
Manny
Profil
aDAm:
spojovací tabulka o dvou sloupcích? id_typ a id_ikona?
Tzn. tabulku se všemi kombinacemi? Když budu mít např. 20 typů a 20 ikon třeba i 400 kombinací?
aDAm
Profil
třeba, pokud těch 20ikon přiřadíš všem 20ti typům
Manny
Profil
aDAm:
A nebude náročnější administrace? Jak provedu třeba UPDATE, když budu mít nejen jiné id_ikona, ale jejich počet v sadě?
Amunak
Profil
Manny:
bude to možná složitější naprogramovat, ale je to jediné správné řešení. Administrace bude pak přesně tak složitá, jak složitou si jí uděláš.

Obecně když jsou dvě sady objektů, které mezi sebou mají vztah n:n (tedy že libovolný počet prvních objektů má vztah s libovolným počtem druhých objektů), nejde vztah mezi nimi vyjádřit jen přiřazením nějaké hodnoty k jednomu nebo druhému objektu. Tedy pokud to chceš udělat správně, a neparsovat třeba nějaké pole s id těch ikonek.

Když tam ten vztah je (parkoviště, wifi, ... v tom místě je) tak ten vztah do té "spojovací" tabulky vložíš; když tam není, tak ho nevkládáš. Je to vlastně docela jednoduché.

Tedy ubytování, kde je všech 20 položek, bude mít 20 záznamů v pomocné tabulce. Ubytování, kde není nic, tam nebude mít nic. Je to jediné správné řešení (obzvlášť, pokud očekáváš, že se ikonky nějak budou měnit). Pokud by šlo jen o nějaký příznak, šlo by to ukládat binárně, a veškeré "vykreslování" ikonek řešit až v kódu. Nešlo by ale snadno přidávat a odebírat ikonky.
aDAm
Profil
Update je jednoduchy, záleží jak to máš celé řešené. Já to třeba přes doctrinu řeším tak že ty vazby vysypu a při save tam nasypu jen ty aktualní, o zbytek se postará doctrine. A nebo pomocí klasického MySQL uděláš při uložení DELETE z vazební tabulky kde id_typu je rovno tomu co edituješ a pak je tam znova nasypeš INSERTy.
Manny
Profil
aDAm:
A nebo pomocí klasického MySQL uděláš při uložení DELETE z vazební tabulky kde id_typu je rovno tomu co edituješ a pak je tam znova nasypeš INSERTy.
Tak to přepokládám. Jen budou 2 dotazy do db.

Nicméně v současné době mám problém se samotným selectem.
Vytvořil jsem tedy spojovací tabulku "vazba_pikto" se sloupci "id_ubyt" a "id_pikto" a tabulka "piktogramy" má "id" a "popis"
Potřebuji tedy vybrat danou sadu i s popisky.
A protože zatím uplně nechápu princip JOIN, toto samozřejmě selhalo:-(

SELECT *
    FROM `vazba-pikto`
    LEFT JOIN `piktogramy`
    ON vizba-pikto.id_pikto = piktogramy.id
    WHERE id_ubyt =24
ts_istudio
Profil
Manny:
A protože zatím uplně nechápu princip JOIN, toto samozřejmě selhalo:-(

Co znamená "selhalo"?
Manny
Profil
ts_istudio:
Co znamená "selhalo"?
Unknown column 'vazba' in 'on clause'

Ale upravil jsem na
LEFT JOIN `piktogramy` ON id_pikto = piktogramy.id

a něco už vypadlo:-)
ts_istudio
Profil
Manny:
a něco už vypadlo:-)

Tabulku bych u těch JOINů spíš uváděl než neuváděl, přinejmenším proto, že mi to připadá přehlednější. Problém tam byl nejspíš v tom mínusu v názvu tabulky. Doporučuji nahradit podtržítkem. Jestlis to pro tento případ vyřešil vynecháním názvu tabulky, příště na to narazíš zase někde jinde.
Manny
Profil
ts_istudio:
Problém tam byl nejspíš v tom mínusu v názvu tabulky
Aha. Dobrá, nahradím podtržítkem.

Ještě jeden dotaz.
Protože potřebuji piktogramy vypisovat do skupiny checkoboxů, musím vypsat všechny položky z "piktogramy" a pak nějak předešlým dotazem oveřovat, zda každý z nich platí/je zatržený.
Bylo by možno to udělat nějakým subselectem?
aDAm
Profil
K tomu selectu bych doplnil aliasy k tabulkám a trošku to prohodil, pak se ti s tím bude snadněji pracovat:

SELECT *
    FROM `piktogramy` AS p
    INNER JOIN `vazba-pikto` AS v ON v.id_pikto = p.id
    WHERE v.id_ubyt =24

A k tomu druhému dotazu. Normálně si udělej select piktogramů který pak v cyklu vypíšeš jako checkboxy:

SELECT *
    FROM `piktogramy` AS p

a k tomu druhý select co fetchneš jako pole podle IDčka:

SELECT *
    FROM `piktogramy` AS p
    INNER JOIN `vazba-pikto` AS v ON v.id_pikto = p.id
    WHERE v.id_ubyt =24

A nebo teoreticky melo fungovat i toto:

SELECT p.*, v.id_ubyt AS checked
    FROM `piktogramy` AS p
    LEFT JOIN `vazba-pikto` AS v ON v.id_pikto = p.id
    WHERE v.id_ubyt =24

a pak v cyklu:

foreach($piktogramy as $piktogram) {
  echo '<input type="checkbox" name="piktogramy['. $piktogram['id_pikto'] .'] '. ($piktogram['checked'] != NULL ? 'checked="checked' : '') .'>';
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: