Relation Abfrage

Hallo Zusammen

Ich tue mich ziemlich schwer mit den Relation, mir ist nach wie vor nicht klar wie Felder, von der in Beziehung stehenden Tabellen, angezeigt werden können.

Be[font="Arial"][size="2"]nutzt Ihr die [/size][/font][font="Arial"][size="2"]Relationale ActiveRecords? [/size][/font]

[font="Arial"][size="2"]Welchen [/size][/font][font="Arial"][size="2"]Vorteile hat es gegenüber der Methode mit z.B. FindBySql Abfragen?[/size][/font]

Mein Dokumentstudium

http://www.yiiframew…de/database.arr

http://www.yiiframew…edene-tabellen/

Gruss Beat

Hallo, Beat

Ich glaube, dass man fast in alle Projekten diese Relationen benutzt. Relationen helfen uns weniger Code zu schreiben und in manchen Fallen auch effizienter Abfragen zum Datenbank auszuführen.

z.B. ich will ein online Shop Seite herstellen. Also ich brauche ungefähr solche Datenbanktabelle: user, shop, shop_categorie, shop_brand, shop_comments, shop_order, shop_char (eigentlich braucht man mehr…). Und in diesem Fall könnten die Relationale ActiveRecords nützlich werden.

z.B. ich will ein Page mit mein Produkt zu zeigen, dafür brauche ich alle Informationen über das Produkt: allgemeine Information (Name, Preis, Bild, Beschreibung, vielleicht noch etwas) das ist shop Tabelle, dazu kommen auch cat_id, prod_id Felder (das ist wichtig für Relation. Es kann auch umgekehrt sein, dass es in andere Tabelle id von Produkt gespeichert wird (so genannte HAS_MANY oder HAS_ONE Relation).). Und jetzt muss man auch Kategorie, Brand, Kommentare, Eigenschaften unseres Produktes herausfinden. Dafür braucht man eigentlich Relationen.

Hier ist Code aus meinen Modell:




public function relations()

   {

     // NOTE: you may need to adjust the relation name and the related

     // class name for the relations automatically generated below.

     return array(

       'brand' => array(self::BELONGS_TO, 'Brand', 'brand_id'),

       'cat' => array(self::BELONGS_TO, 'Categorie', 'cat_id'),

       'comments' => array(self::HAS_MANY, 'Comment', 'prod_id'),

       'charShema' => array(self::BELONGS_TO, 'CharShema', 'cat_id'),

       'char' => array(self::HAS_MANY, 'Char', array('prod_id'=>'id')),

       'user' => array(self::BELONGS_TO, 'User', 'user_id'),

       'supplier' => array(self::BELONGS_TO, 'Supplier', array('supplier_id'=>'id')),

     );

   }



jetzt kann man so was schreiben:


$shop = Shop::model()->with('brand', 'cat')->findByAttributes(array('alias' => $pageUri));

// `with` bedeutet, dass ich will auch die Kategorie und das Brand als eine Abfrage bekommen. Also es wird nur eine Abfrage anstatt drei.


$shop->title; // Produktname

$shop->cat->name; // Kategoriename des Produktes

$shop->brand->name; //...


// jetzt will auch weitere Eigenschaften des Produktes bekommen. 

// Es kann Farbe, Dimensionierung, technische Charakteristiken sein 

// also unseres Produkt hat viele solche Eigenschaften (HAS_MANY)

foreach($shop->char as $char)

{

    echo $char->title . ': ' . $char->value;

}



Ungefähr dafür braucht man Relationen. Es war sehr vereinfacht. In der Realität ist es alles ein bisschen komplexer. Man kann auch Relationen erzeugen, die durch andere Relationen herausgerufen werden. Es gibt auch so genannte "Scopes" usw. Ich glaube, dass du es in Lauf der Zeit langsam verstehen wirst. Ich selbst weiß nicht alles, aber viel mehr als damals, wenn ich angefangen hatte.

Du kannst fast alle einfache Relationen mit Gii Tool erzeugen, aber um das zu machen, brauchst du diese Relationen als ‘foreign keys’ im deinen Datenbank einstellen.

Beste Grüße

Seid gegrüsst SleepWalker

Du hast den Nagel wieder auf den Kopf getroffen. Ich wusste nicht wie ich auf die relationalen Felder zugreife:

Nun ist es mir klar.


$shop->cat->name; // Kategoriename des Produktes

Zudem werde ich wie von Dir empfohlen meine MySql Tabellen auf InnoDB umstellen und die Beziehungen setzen damit die Power von Gii mit mir ist.

Nochmals Danke für die Hilfe.

Grüsse Beat

Liveumgebung (Prototyp) Falls jemand mitmachen will einfach melden.


Für alle die auch hier vorbeikommen: Relationale Felder in Gridvew