[MySQL] Has many relatie bouwen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Vinze
  • Registratie: Augustus 2006
  • Laatst online: 20-09 09:35
Ik ben bezig met het maken van een eigen MVC framework voor PHP. Dit doe ik puur voor het leerproces, niet om te gaan 'concurreren' met al bestaande frameworks, die kwaliteit zal ik toch nooit halen in m'n eentje.

Maar nu loop ik tegen het volgende aan:
Ik heb een aantal menu's en hieronder vallen weer diverse categorieën. Nu wil ik graag met een MySQL query alle menu's ophalen, en dan per menu een apart array (of object) meekrijgen welke de categorieën bevat.
Hieronder een voorbeeld van de database tabellen:

menus
id
name

categories
id
menu_id
name

En hoe ik de data terug wil krijgen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[menus] => Array
(
    [0] => Array
        (
            [id] => 2
            [name] => Hoofdmenu
            [categories] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [menu_id] => 2
                            [name] => Hoofdgerechten
                        )

                    [1] => Array
                        (
                            [id] => 5
                            [menu_id] => 2
                            [name] => Voorgerechten
                        )

                )

        )

    [1] => Array
        (
            [id] => 1
            [name] => Kerstmenu
            [categories] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [menu_id] => 1
                            [name] => Dranken
                        )

                    [1] => Array
                        (
                            [id] => 3
                            [menu_id] => 1
                            [name] => Nagerechten
                        )
                        
                )

        )

)


Momenteel bereik ik dit op de volgende manier:
PHP:
1
2
3
4
5
6
7
8
9
10
11
$sql = "SELECT * FROM menus ORDER BY name ASC";
$results = $this->db->fetch_rows($sql);

$i = 0;
foreach ($results as $row) {
    $categories = $this->db->fetch_rows('SELECT * FROM categories WHERE menu_id = '.$row['id']);
    $return[$i] = $row;
    $return[$i]['categories'] = $categories;
    $i++;
}
return $return;

(Bovenstaande functie fetch_rows haalt de resultaten op uit de database en zet deze in een array, hoe deze verder opgebouwd is lijkt me hier niet van belang..)

Nou werkt dit op zich prima, echter lijkt het me niet zo efficiënt om per menu item een nieuwe SELECT uit te voeren op de categories tabel. Nu denk ik dat het opgelost moet worden door middel van een JOIN, alleen ik weet niet hoe ik deze moet formuleren zodat er per menu item een 'diepere' categories array bij zit.

Heb al flink zitten googelen, maar bij alles wat ik vind wordt alleen uitgelegd hoe een has_many gebruikt kan worden. Ik wil juist weten hoe dit "onder water" werkt en dat wordt nergens duidelijk uitgelegd.

Ik hoop dat het verhaal zo duidelijk!

Acties:
  • 0 Henk 'm!

  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 14:40

Acties:
  • 0 Henk 'm!

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 16:08

BCC

Rails heeft ook een vrij eenvoudige & nette has_many.
Bijvoorbeeld hier:
http://stackoverflow.com/...-association-methods-work

of hier:
http://blog.hasmanythrough.com/2006/4/3/polymorphic-through

Staat een nette uitleg.

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Acties:
  • 0 Henk 'm!

  • Vinze
  • Registratie: Augustus 2006
  • Laatst online: 20-09 09:35
Bedankt voor tips! Heb nu het volgende in elkaar gezet:

PHP:
1
2
3
4
5
6
7
8
9
10
11
$menus = $this->db->fetch_rows("SELECT * FROM menus ORDER BY name ASC");
$categories = $this->db->fetch_rows("SELECT * FROM categories ORDER BY name ASC");

foreach ($menus as $row) {
    $data[$row['id']] = $row;
}
foreach ($categories as $row) {
    $data[$row['menu_id']]['categories'][] = $row;
}

return $data;


Nu heb ik nog maar 2 queries nodig, zou dus iets efficiënter moeten zijn lijkt mij.
Meer ideeën en vooral voorbeelden zijn altijd welkom!

Acties:
  • 0 Henk 'm!

  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 14:40
Ik heb geen verder inzicht in je tabellen, maar menus en categories lijken nogal op elkaar. Kun je ze niet samenvoegen?

Overigens is 'select *' over het algemeen niet aan te raden.

Acties:
  • 0 Henk 'm!

  • Vinze
  • Registratie: Augustus 2006
  • Laatst online: 20-09 09:35
Ja zou ze misschien wel kunnen samenvoegen, moet alleen even kijken hoe ik de verdere database ga opzetten.

Wat betreft die "select *" heb je helemaal gelijk, dit is puur om even snel te testen ;)

[ Voor 4% gewijzigd door Vinze op 05-10-2012 14:39 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Dat 'array' fetisjisme van php-ers blijft me verbazen eigenlijk.

Maar goed. Het gaat hier over een menu dat nooit dieper gaat dan 2 levels. Dat is op zich behoorlijk simpel te doen door een simpele join. Door te sorteren op hoofd item zullen alle subitems na elkaar komen. Tijdens het doorlopen van je resultset kun je dan gewoon kijken of het huidige hoofditem hetzelfde is als de vorige. Zo ja, dan toevoegen. Zo nee, nieuw hoofditem aanmaken en daaraan toevoegen.

Dit topic is trouwens meer op zijn plaats in Programming.

[ Voor 6% gewijzigd door Janoz op 05-10-2012 14:52 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1