比方說,你有23個套件和512個不同的部分。如何定義套件1使用A,B和C部分,而套件2使用A,D,E和F部分?數據透視表是定義每個套件及其部件之間關係的好方法。一旦你有一個套件表,一個零件表和一個KitParts表,那麼你可以將三者結合在一起以便查詢。一旦加入成爲你的第二天性,他們實際上很樂意與之合作。
就PhalconPHP而言,hasMany
和belongsTo
(note it has an s)結合數據透視表是一個很好的解決方案。在數據透視表中,您可以參考套件的ID和零件的ID。
假設用戶正在查看所有套件的列表,並且他們點擊了特定的套件,現在您想顯示所有包含的部件。您的示例與Phalcon manual shows幾乎完全相同。但在如何我親自寫的術語,我會採取多種以下路線:
(注:這是所有未經測試,我還沒有在幾個月感動爾康)
//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'
)
));
}
}
然後顯示特定套件所有部分,你會寫:
$kit = Kits::findFirst(123);//Find record with id = 123
foreach ($kit->kitParts as $kitPart)
{
echo htmlentities($kitPart->parts->name), "<br>\n";
}
你還可以添加一個方法來你的套件類,使生活更輕鬆: (同樣,這是未經測試...如果是,請參閱documentation有些事情是錯的。)
//Add this as a method to the "Kits" class
public function getParts()
{
$results = array();
foreach ($this->kitParts as $kitPart)
{
$results[] = $kitPart->parts;
}
return $results;
}
然後,你會怎麼做:
$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";
}
爲什麼向下票呢? – Steven