Autor Zpráva
quatzael
Profil
Řekněme, že budu mít tři tabulky:



Když budu chtít vybrat Ferdu, a všechny jeho produkty, který si v jedné objednávce objednal, jak to udělám?
Nejlépe, aby šel ten celý výsledek dostat do pole, nějak takto:

$result = mysqli_fetch_assoc($query);
Aby obsah proměnných byl následující:
$result['client'] ... Ferda
$result['product'][0] ... lopatka
$result['product'][1] ... kyblíček
$result['product'][2] ... šroubovák

Jde mi hlavně o to v jednom dotazu získat všechny výsledky do pole.

Nemám vůbec tušení jak tyhle JOIN dotazy fungují.. Pokud by to vyhazovalo automaticky něco takového: $result['clients']['client'], tedy multi pole podle názvů tabulek a potom teprve sloupců, lze nějak docílit, aby se dala ta struktura asociativního pole předem upravit, aby například šlo místo názvu tabulky zvolit jiný, např. abych získal $result['visitors']['client']?

Předem díky za odpovědi.


A ještě jaký použít klíč na sloupce client_id a product_id? Jestli je vůbec použití klíčů v tomto případě nutné..
Alphard
Profil
Chtít to na jednom řádku by nebylo moc rozumné, ale ty to tak ani nechceš, viz ta žádaná struktura pole. Ta je rozumná, ale určitě to není jeden řádek. (SQL moc neumí vracet dynamický počet řádků sloupců a blbě by se s tím pracovalo, o to se ani nesnaž.)

Tohle je buď typický příklad na join, který se seskupí u klienta ( Diskuse JPW: Nejčastější potíže s PHP (FAQ) » Nadpis skupiny nejen při výpisu z databáze), nebo to vybrat pomocí více dotazů (na základě id a spárovat v PHP).

Srování různých přístupů na Srovnání dotazů do závislých tabulek.


Pomocí NotORM by to bylo úplně bez práce.
quatzael
Profil
Alphard:
Díky za odpověď. A jak by to teda bylo pomocí toho NotORMu? Vůbec jsem o tom doteď neslyšel.. Jen vím, že existuje dibi, ale nedokážu moc porovnat výhody jednotlivých frameworků, takže si nejsem jistej do čeho se pustit..
Alphard
Profil
quatzael:
A jak by to teda bylo pomocí toho NotORMu? Vůbec jsem o tom doteď neslyšel..
Já jsem NotORM doplnil spíš pro zajímavost. To je knihovna, která dělá přesně to párování dat v PHP, o kterém jsem psal v [#2] Alphard. Kdybys ho používal, automaticky by si vytahal všechna potřebná data, aniž by bylo potřeba psát join nebo cokoliv ručně párovat, nějak takhle:
foreach ($db->books() as $book) { // automatický "hlavní" select z tabulky books
    echo $book["title"];
    echo $book->author["name"] ; // data z tabulky author
    foreach ($book->book_category() as $book_category) { // automatický select z referencované tabulky přes "spojovací tabulku" v relaci M:N, tj. automatický join
        echo $book_category->category["category"];
    }
}
Příklad jsem upravil z www.sitepoint.com/database-interaction-made-easy-with-notorm, zdůrazňuji, že tohle automaticky vytahá data ze 4 tabulek.

Dibi je víc nízkoúrovňové, tam by se spíš hodilo napsat si ručně ten join a pro rozdělení dat použít metodu fetchAssoc(). Nette\Db potom v podstatě spojuje dřívější dibi a NotORM dohromady.

Aspoň dibi doporučuji, protože pracovat s čistým mysqli se mi zdá praštěné. Ale to jsem tady uváděl asi tisíckrát...
quatzael
Profil
Alphard:
No jestli jsem to správně pochopil, tak pro použití notORM je potřeba mít v tabulkách sloupečky obsahující klíč a odkazující na jinou tabulku ve formátu nazevtabulky_id.

Jenže si nejsem jistý, jestli to řeší můj problém. Já potřebuju, aby mi to vyhledávalo v tomto systému.
Klient - Ferda, ve sloupečku orders je 6, tudíž se vyhledá řádek v tabulce orders sloupeček clients_id s číslem 6, zjistí se hodnota ve sloupečku products (zde 1) a potom vyhledá všechny řádky v tabulce products, které mají ve sloupečku product_id hodnotu 1..

Teď jsem si trochu uvědomil, že jsem nenazval ty sloupečky moc šťastně, třeba to client_id nesouvisí s id v tabulce clients, ale se sloupečkem orders

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: