WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Komplicerad hierarki med Codeigniter (https://www.wn.se/forum/showthread.php?t=1040225)

Althalos 2010-01-27 20:46

Komplicerad hierarki med Codeigniter
 
Hej
Mitt scenario är att jag försöker bygga ett system där man kan skapa ett oändligt antal med underkategorier och jag kan inte riktigt lura ut hur jag ska göra detta i Codeigniter, där det blir extra svårt på grund av mcv-uppdelningen.

Min databastabell kan jag designa om ifall det är den bästa lösningen, men just nu har den fälten "id, parent, name" där parent alltså är id:t av en annan kategori eller tomt om kategorin inte är en underkategori.

För att skriva ut det här skulle man ju vanligtvis kunnat skriva någon typ av rekursiv funktion som använder sig av flera mysql-satser och direkt skriver ut dem sedan... men med MVC, hur gör man då?

Jag behöver alltså en modellfunktion som hämtar all data som behöver hämtas, detta ska vi controllern skickas till viewn i form av en array.

Det är viktigt att systemet kan hantera ett oändligt antal kategorier och underkategorier.

KarlRoos 2010-01-28 00:05

Jag förstår inte riktigt problemet. Vad har det här med MVC att göra?

I CI kan du skriva helt egna MySQL queries, sedan är det bara att köra $result = $this->db->query(' sql .. ');

Och köra på precis som vanligt ;)

Althalos 2010-01-28 20:57

Nej, för jag kan ju inte echoa direkt så jag måste spara det på något sätt, t.ex. i en array så att jag kan skriva ut den arrayen senare, i viewn. Jag har letat upp ett exempel på vad jag menar, visa mig hur jag kan skriva följande för codeigniter:
Kod:

function display_children($parent, $level) {
  // retrieve all children of $parent
  $result = mysql_query('SELECT title FROM tree '.
                          'WHERE parent="'.$parent.'";');

  // display each child
  while ($row = mysql_fetch_array($result)) {
      // indent and display the title of this child
      echo str_repeat('  ',$level).$row['title']."\n";

      // call this function again to display this
      // child's children
      display_children($row['title'], $level+1);
  }
}

http://articles.sitepoint.com/articl...-data-database

Den koden skriver ut informationen... men det gör den genom att köra en ny query för varje nivå. Visst, jag kan köra flera queries, men det måste ske i modellen. Och därifrån kan jag inte echoa. Jag är kanske inte jättebra på att förklara.. men är det någon som förstår mitt problem?

Här är en liten början:
Kod:

<?php
class Articles_model extends Model
{
        $categories[] = '';

        function articles_model()
        {
                parent::Model();
        }
       
        function get_categories($parent)
        {
                $result = $this->db->where('parent', $parent)
                        ->order_by('parent', 'asc')
                        ->get('articles_categories')
                        ->result_array();
               
                foreach($result as $category)
                {
                       
                }
        }
}
?>

$categories[] är alltså till för att man ska kunna göra funktionen rekursiv och samtidigt spara informationen någonstans.. men hur vet jag ej.

tartareandesire 2010-01-28 23:12

Jag kan inte CI men att köra flera queries låter inte som en bra idé.

Althalos 2010-01-29 12:15

Hur ska jag göra då? Annan struktur på databasen?

dotvoid 2010-01-29 18:32

Hierarkisk data bör hanteras som med nested set-metoden enligt vad som beskrivs bra här: http://dev.mysql.com/tech-resources/...ical-data.html

Jag skrev också ett blogginlägg för länge sedan om hur man jobbar med sortering i php/javascript http://www.dotvoid.com/page/3/.

Att jobba "traditionellt" med hierakisk data i sql är inte så lysande prestandamässigt om du t ex ofta ska visa ett helt träd.

Althalos 2010-01-30 12:47

Tack, det var precis vad jag behövde. Kunde nu också söka mer specifikt och hittade då ett speciellt library för CI som använde det din länk beskriver.


Alla tider är GMT +2. Klockan är nu 22:35.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson