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";
}
Warum die unten Abstimmung? – Steven