2016-06-22 7 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です)

私はわかりません「belongsTo」と「hasMany "が必ずここに適用されるか、そうであればどのように実装されますか?

コード化はであり、PhalconPHPを使用している。MongoDB

あなたのご意見やご提案をありがとうございます。

スティーブン

+0

をなぜダウン投票? – Steven

答えて

0

23個のキットと512個の異なる部分があるとします。キット2はパーツA、B、Cを使い、キット2はパーツA、D、E、Fを使います。ピボットテーブルは、各キットとその部品の関係を定義するのに適したソリューションです。 Kitsテーブル、Partsテーブル、およびKitPartsテーブルを作成したら、3つのテーブルを結合して簡単にクエリを実行できます。いったん結合があなたにとって第二の性質になると、彼らは実際に働くことが楽しいです。

PhalconPHPに関しては、ピボットテーブルと組み合わせたhasManybelongsTonote it has an s)が最適です。ピボットテーブルでは、キットのIDとパーツのIDを参照します。

ユーザーが現在、すべてのキットの一覧を表示していて、特定のキットをクリックしているとします。これで、すべての部分が含まれていることを表示します。あなたの例は、Phalcon manual showsとほぼ同じ状況です。しかし、私は個人的にそれを書くだろうかという点で、私はより多くの次のルートを取ると思います:

注:これは、すべてのテストされていないと私は数ヶ月でphalconに触れていない)

//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"; 
} 

また人生を容易にするために、あなたのキットのクラスにメソッドを追加することができます。 (繰り返しますが、これはテストされていません... if 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"; 
} 
関連する問題