2016-06-22 49 views
-1

我認爲我的問題需要一個數據透視表,但我希望在花費大量時間嘗試實現之前清楚。我還沒有爲任何項目使用數據透視表。有人可以幫助我理解透視表中的外行人術語?

我有一個新的項目,其中包含多個「工具包」,其中有共同的「部分」,在某些情況下,一部分可以與另一個工具包的部分進行互換。同樣,並非所有部件都相互兼容。

我不希望創建一些噩夢般的SQL查詢,而是希望本質上構建一個表來存儲兼容性信息,以交叉引用一個簡單的SQL查詢。

例子:

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

或者例如:

SELECT partID FROM crossRefTable WHERE partA and partE are true. 

(是的,SQL查詢exmple僅強調點)

我不知道即「歸屬於」和「hasMany「必然適用於此,或者如果是這樣,將如何實施?

編碼在PhalconPHP使用MongoDB

謝謝你的想法和建議。

Steven

+0

爲什麼向下票呢? – Steven

回答

0

比方說,你有23個套件和512個不同的部分。如何定義套件1使用A,B和C部分,而套件2使用A,D,E和F部分?數據透視表是定義每個套件及其部件之間關係的好方法。一旦你有一個套件表,一個零件表和一個KitParts表,那麼你可以將三者結合在一起以便查詢。一旦加入成爲你的第二天性,他們實際上很樂意與之合作。

就PhalconPHP而言,hasManybelongsTonote 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"; 
} 
相關問題