2016-06-22 12 views
-1

Ich denke, mein Problem erfordert eine Pivot-Tabelle, aber ich möchte klar sein, bevor ich viel Zeit mit dem Implementieren verbringen muss. Ich habe noch keine Pivot-Tabellen für irgendwelche Projekte verwendet.Kann jemand mir helfen, Pivot-Tabellen in Laien zu verstehen?

Ich habe ein neues Projekt, das mehrere "Kits" enthält, die gemeinsame "Teile" unter ihnen haben und in einigen Fällen kann ein Teil mit denen für ein anderes Kit ausgetauscht werden. Ebenso sind nicht alle Teile miteinander kompatibel.

Anstatt einige alptraumhafte SQL-Abfragen zu erstellen, hatte ich gehofft, im Wesentlichen eine Tabelle zu erstellen, die Kompatibilitätsinformationen speichert, um Querverweise auf eine einfache SQL-Abfrage zu erstellen.

Beispiel:

SELECT kitID FROM crossRefTable WHERE partA, partC and partE are true. 

Oder zum Beispiel:

SELECT partID FROM crossRefTable WHERE partA and partE are true. 

(Ja, die SQL-Abfragen sind exmple nur zum Spannen des Punktes)

Ich bin nicht sicher dass die "gehören zu" und "hasMany "unbedingt gelten hier oder wenn ja wie würde das umgesetzt werden?

Codierung ist in PhalconPHP mit MongoDB.

Vielen Dank für Ihre Gedanken und Anregungen.

Steven

+0

Warum die unten Abstimmung? – Steven

Antwort

0

Angenommen, Sie 23 Kits und 512 verschiedene Teile haben. Wie definieren Sie, dass Kit 1 die Teile A, B und C verwendet, während Kit 2 die Teile A, D, E und F verwendet? Ein Pivot-Tisch ist eine gute Lösung, um die Beziehung zwischen jedem Kit und seinen Teilen zu definieren. Sobald Sie eine Kits-Tabelle, eine Parts-Tabelle und eine KitParts-Tabelle haben, können Sie die drei für einfache Abfragen miteinander verbinden. Sobald Joins Ihnen zur zweiten Natur werden, ist es wirklich ein Vergnügen, mit ihnen zu arbeiten.

In Bezug auf PhalconPHP, hasMany und belongsTo (note it has an s) mit einem Drehtisch kombiniert ist eine große Lösung. In der Pivot-Tabelle würden Sie die ID eines Kits und die ID eines Teils referenzieren.

Angenommen, der Benutzer zeigt derzeit eine Liste aller Kits an, und sie klicken auf ein bestimmtes Kit, jetzt möchten Sie alle enthaltenen Teile anzeigen. Ihr Beispiel ist fast genau die gleiche Situation wie die Phalcon manual shows. Aber in Bezug darauf, wie ich persönlich würde es schreiben, würde ich mehr die folgende Route nehmen:

(Hinweis: das alles ungetestet ist und ich habe nicht Phalcon in ein paar Monaten berührt)

//Use your BaseModel to take some of the weight off your Models. 
//Nobody likes dirty Models, just ask Victoria's Secret. :p 
//BaseModels are a good place to add your own methods, 
//that way all models have access to them. 
class BaseModel extends \Phalcon\Mvc\Model 
{ 
} 

class Kits extends Basemodel 
{ 
    public $id; 
    public $name; 
    public function initialize() 
    { 
     $this->hasMany('id', 'KitParts', 'kit_id', array(
     'foreignKey' => array(
     'message' => 'Kit cannot be deleted because it\'s used by KitParts' 
     ) 
     )); 
    } 
} 

//Pivot table 
class KitParts extends BaseModel 
{ 
    public $id; 
    public $kit_id; //primary key used in Kits.id 
    public $part_id; //primary key used in Parts.id 
    $this->belongsTo('kit_id', 'Kits', 'id'); 
    $this->belongsTo('part_id', 'Parts', 'id'); 
} 

class Parts extends BaseModel 
{ 
    public $id; 
    public $name; 
    public function initialize() 
    { 
     $this->hasMany('id', 'KitParts', 'part_id', array(
     'foreignKey' => array(
     'message' => 'Part cannot be deleted because it\'s used by KitParts' 
     ) 
     )); 
    } 
} 

Dann alle Teile für einen bestimmten Satz anzuzeigen, würden Sie schreiben:

$kit = Kits::findFirst(123);//Find record with id = 123 
foreach ($kit->kitParts as $kitPart) 
{ 
    echo htmlentities($kitPart->parts->name), "<br>\n"; 
} 

Sie können auch eine Methode, um Ihre Kits Klasse hinzufügen Leben leichter zu machen: (auch dies ist nicht getestet ... beziehen Sie sich auf die documentation wenn Irgendwas stimmt nicht.

)
//Add this as a method to the "Kits" class 
public function getParts() 
{ 
    $results = array(); 
    foreach ($this->kitParts as $kitPart) 
    { 
     $results[] = $kitPart->parts; 
    } 
    return $results; 
} 

Dann würden Sie tun:

$kit = Kits::findFirst(123);//Find record with id = 123 
$parts = $kit->getParts(); 
if(count($parts) > 0) 
{ 
    echo "<strong>Parts</strong><br>\n"; 
    foreach($parts as $part) 
    { 
     echo htmlentities($part->name),"<br>\n"; 
    } 
}else{ 
    echo "No parts to show.<br>\n"; 
}