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