23個のキットと512個の異なる部分があるとします。キット2はパーツA、B、Cを使い、キット2はパーツA、D、E、Fを使います。ピボットテーブルは、各キットとその部品の関係を定義するのに適したソリューションです。 Kitsテーブル、Partsテーブル、およびKitPartsテーブルを作成したら、3つのテーブルを結合して簡単にクエリを実行できます。いったん結合があなたにとって第二の性質になると、彼らは実際に働くことが楽しいです。
PhalconPHPに関しては、ピボットテーブルと組み合わせたhasMany
とbelongsTo
(note 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";
}
をなぜダウン投票? – Steven